Wiki Seb35
wiki_seb35
http://wiki.seb35.fr/Accueil
MediaWiki 1.37.0-alpha
first-letter
Média
Spécial
Discussion
Utilisateur
Discussion utilisateur
Wiki Seb35
Discussion Wiki Seb35
Fichier
Discussion fichier
MediaWiki
Discussion MediaWiki
Modèle
Discussion modèle
Aide
Discussion aide
Catégorie
Discussion catégorie
Projet
Discussion projet
Tutorial
Discussion tutorial
Présentation
Discussion présentation
Module
Discussion module
Accueil
0
1
1
2014-09-03T10:36:23Z
MediaWiki default
0
wikitext
text/x-wiki
'''MediaWiki a été installé avec succès.'''
Consultez le [//meta.wikimedia.org/wiki/Aide:Contenu Guide de l’utilisateur] pour plus d’informations sur l’utilisation de ce logiciel de wiki.
== Pour démarrer ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Liste des paramètres de configuration]
* [//www.mediawiki.org/wiki/Manual:FAQ/fr FAQ sur MediaWiki]
* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Liste de discussion sur les distributions de MediaWiki]
* [//www.mediawiki.org/wiki/Localisation#Translation_resources Adaptez MediaWiki dans votre langue]
e2ba2fe8cdbd5af69eb05374592f01b53785a227
28
1
2014-11-27T15:42:48Z
Seb35
1
+pages du wiki pour accès direct
wikitext
text/x-wiki
'''MediaWiki a été installé avec succès.'''
Consultez le [//meta.wikimedia.org/wiki/Aide:Contenu Guide de l’utilisateur] pour plus d’informations sur l’utilisation de ce logiciel de wiki.
== Pour démarrer ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Liste des paramètres de configuration]
* [//www.mediawiki.org/wiki/Manual:FAQ/fr FAQ sur MediaWiki]
* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Liste de discussion sur les distributions de MediaWiki]
* [//www.mediawiki.org/wiki/Localisation#Translation_resources Adaptez MediaWiki dans votre langue]
== Pages du wiki ==
{{Special:Allpages}}
9d5bf6b276809cea155587b8c42e6eb793459457
Archéo Lex
0
2
2
2014-09-03T21:42:02Z
Seb35
1
init
wikitext
text/x-wiki
'''Archéo Lex''' est un de mes projets visant à offrir une visualisation des textes de lois français ''pratique'' et ''jolie'', que je transpose en ''[https://fr.wikipedia.org/wiki/Git Git]'' + ''[https://fr.wikipedia.org/wiki/Markdown Markdown]''.
Le dépôt Git du code est sur [https://github.com/Seb35/Archeo-Lex Github], un exemple avec le [https://github.com/Seb35/CPI code de la propriété intellectuelle] y est également disponible ([https://github.com/Seb35/CPI/blob/master/Code%20de%20la%20propriété%20intellectuelle.md dernière version du texte], [https://github.com/Seb35/CPI/commit/50283dda63cef5a45a992d649b4d2ff2b1f7b546 un exemple de modification]) et un [[:blog:billet/Archéo-Lex,-Pure-Histoire-de-la-Loi-française,-pour-étudier-son-évolution|billet de blog introductif]] est disponible sur mon blog.
Ci-dessous différentes choses liées au développement. Si vous comptez faire des modifs substantielles, dites-moi un peu en quoi ça consiste et je pourrai vous donner les droits en commit sur Github. Noter que la licence d’Archéo Lex est la [http://www.wtfpl.net/ WTFPL 2.0].
== Roadmap ==
Réparti en grandes thématiques. Les chiffres (1) (2) définissent une indication de priorité. Lorsque c’est marqué (README), ce point est issu du README Github, le retirer quand c’est résolu. N’hésitez pas à discuter autour de ces points (je peux ouvrir des comptes sur le wiki sur demande).
# Prise en compte des mises à jour différentielles de la base LEGI :
## (README) (1) mise à jour des nouvelles versions des textes sans recalcul de l’entièreté de la base
## (README) (2) téléchargement automatique des bases LEGI (et autres) et de leurs mises à jour incrémentales
# Étudier les réécritures d’historiques, s’il y en a (si la DILA modifie la base LEGI quand il y a des fautes de retranscription entre ''La Loi'' et ce qui est publié dans la base LEGI) :
## (README) (3) intégration des modifications d’historique (orthographe, typographie, coquilles, etc.) quand les mises à jour le demandent (à étudier)
# Problèmes et améliorations mineurs :
## (README) (3) réfléchir à une façon d’intégrer à Git les textes pré-1970 (inféfieurs à l’epoch, refusés par Git, par ex LEGITEXT000006070666)
## (README) (5) mettre les dates de commit à la date d’écriture ou de publication du texte modificateur (à réfléchir) (attention : cette 2e date peut être avant, après ou identique à la date d’entrée en vigueur) pour créer des visualisations intégrant ces différences de dates
## (3) généraliser les interfaces de création de syntaxe (pour implémenter d’autres languages que le Markdown) et d’enregistrement des versions (pour implémenter d’autres cadres de gestion de versions : svn, plusieurs fichiers avec des suffixes par date, hg, etc.)
# Qualité :
## (README) (4) vérifier plus en profondeur la qualité des résultats (par exemple dans le code des assurances il y a actuellement une différence vide vers le début)
## (README) (5) écrire la grammaire exacte du sous-ensemble Markdown utilisé et des autres éléments de syntaxe utilisés (cf points 6 et 12)
## (README) (5) documenter plus et mieux
## (README) (4) ajouter des tests unitaires
# Interactions et interface utilisateur :
## (README) (4) ajout de branches (orphelines) Git avec liens vers les autres textes (liens soit juste mentionnés en-dessous de l’article comme sur Légifrance, soit au sens Markdown+Git similairement à Légifrance)
## (README) (4) faire expérimenter la syntaxe Markdown et autres éléments de syntaxe à des publics non-informaticiens et réfléchir à l’améliorer (cf points 7 et 12)
## (README) (5) création ou adaptation d’interfaces de visualisation (cf point 16)
# Production :
## (README) (6) mise en production d’un service web qui mettrait à jour quotidiennement les dépôts Git
## (README) (6) création d’un site web permettant la visualisation des modifications, proposerait des liens RSS, etc. de façon similaire à La Fabrique de la Loi, à Légifrance, aux sites du Sénat ou de l’Assemblée nationale (cf point 11)
# Futur :
## (README) (7) travail sur les autres textes législatifs que les codes (les seuls testés actuellement), comme les Constitutions, les lois, les décrets, etc.
## (README) (7) travail sur les autres bases (KALI pour les conventions collectives, JORF pour le journal officiel -- ce dernier n’a pas de versions à ma connaissance mais demanderait juste à être transformé en Markdown)
== Recherche ==
* [[Syntaxes de formatage léger|Comparaison de syntaxe de formatage léger]]
f2ab37a0321deaf3c5fe2801cabd6827a777fe7f
44
2
2014-12-22T14:03:45Z
Seb35
1
+cat
wikitext
text/x-wiki
'''Archéo Lex''' est un de mes projets visant à offrir une visualisation des textes de lois français ''pratique'' et ''jolie'', que je transpose en ''[https://fr.wikipedia.org/wiki/Git Git]'' + ''[https://fr.wikipedia.org/wiki/Markdown Markdown]''.
Le dépôt Git du code est sur [https://github.com/Seb35/Archeo-Lex Github], un exemple avec le [https://github.com/Seb35/CPI code de la propriété intellectuelle] y est également disponible ([https://github.com/Seb35/CPI/blob/master/Code%20de%20la%20propriété%20intellectuelle.md dernière version du texte], [https://github.com/Seb35/CPI/commit/50283dda63cef5a45a992d649b4d2ff2b1f7b546 un exemple de modification]) et un [[:blog:billet/Archéo-Lex,-Pure-Histoire-de-la-Loi-française,-pour-étudier-son-évolution|billet de blog introductif]] est disponible sur mon blog.
Ci-dessous différentes choses liées au développement. Si vous comptez faire des modifs substantielles, dites-moi un peu en quoi ça consiste et je pourrai vous donner les droits en commit sur Github. Noter que la licence d’Archéo Lex est la [http://www.wtfpl.net/ WTFPL 2.0].
<div style="border:1px solid black;padding:0.5em;">
<u>Sous-pages sur Archéo Lex :</u>
{{Spécial:Prefixindex/Archéo Lex/}}
</div>
== Roadmap ==
Réparti en grandes thématiques. Les chiffres (1) (2) définissent une indication de priorité. Lorsque c’est marqué (README), ce point est issu du README Github, le retirer quand c’est résolu. N’hésitez pas à discuter autour de ces points (je peux ouvrir des comptes sur le wiki sur demande).
# Prise en compte des mises à jour différentielles de la base LEGI :
## (README) (1) mise à jour des nouvelles versions des textes sans recalcul de l’entièreté de la base
## (README) (2) téléchargement automatique des bases LEGI (et autres) et de leurs mises à jour incrémentales
# Étudier les réécritures d’historiques, s’il y en a (si la DILA modifie la base LEGI quand il y a des fautes de retranscription entre ''La Loi'' et ce qui est publié dans la base LEGI) :
## (README) (3) intégration des modifications d’historique (orthographe, typographie, coquilles, etc.) quand les mises à jour le demandent (à étudier)
# Problèmes et améliorations mineurs :
## (README) (3) réfléchir à une façon d’intégrer à Git les textes pré-1970 (inféfieurs à l’epoch, refusés par Git, par ex LEGITEXT000006070666)
## (README) (5) mettre les dates de commit à la date d’écriture ou de publication du texte modificateur (à réfléchir) (attention : cette 2e date peut être avant, après ou identique à la date d’entrée en vigueur) pour créer des visualisations intégrant ces différences de dates
## (3) généraliser les interfaces de création de syntaxe (pour implémenter d’autres languages que le Markdown) et d’enregistrement des versions (pour implémenter d’autres cadres de gestion de versions : svn, plusieurs fichiers avec des suffixes par date, hg, etc.)
# Qualité :
## (README) (4) vérifier plus en profondeur la qualité des résultats (par exemple dans le code des assurances il y a actuellement une différence vide vers le début)
## (README) (5) écrire la grammaire exacte du sous-ensemble Markdown utilisé et des autres éléments de syntaxe utilisés (cf points 6 et 12)
## (README) (5) documenter plus et mieux
## (README) (4) ajouter des tests unitaires
# Interactions et interface utilisateur :
## (README) (4) ajout de branches (orphelines) Git avec liens vers les autres textes (liens soit juste mentionnés en-dessous de l’article comme sur Légifrance, soit au sens Markdown+Git similairement à Légifrance)
## (README) (4) faire expérimenter la syntaxe Markdown et autres éléments de syntaxe à des publics non-informaticiens et réfléchir à l’améliorer (cf points 7 et 12)
## (README) (5) création ou adaptation d’interfaces de visualisation (cf point 16)
# Production :
## (README) (6) mise en production d’un service web qui mettrait à jour quotidiennement les dépôts Git
## (README) (6) création d’un site web permettant la visualisation des modifications, proposerait des liens RSS, etc. de façon similaire à La Fabrique de la Loi, à Légifrance, aux sites du Sénat ou de l’Assemblée nationale (cf point 11)
# Futur :
## (README) (7) travail sur les autres textes législatifs que les codes (les seuls testés actuellement), comme les Constitutions, les lois, les décrets, etc.
## (README) (7) travail sur les autres bases (KALI pour les conventions collectives, JORF pour le journal officiel -- ce dernier n’a pas de versions à ma connaissance mais demanderait juste à être transformé en Markdown)
== Recherche ==
* [[Syntaxes de formatage léger|Comparaison de syntaxe de formatage léger]]
[[Catégorie:Archéo Lex]]
03e84843dd604d89957bfcb403a02a92e60e23c0
Syntaxes de formatage léger
0
3
3
2014-09-04T12:05:05Z
Seb35
1
init
wikitext
text/x-wiki
== Ressources ==
L’article Wikipédia en anglais "[https://en.wikipedia.org/wiki/Lightweight_markup_language Lightweight markup language]" est bien fait et compare les différentes syntaxes.
Autres avis ci et là :
* http://dubroy.com/blog/on-wiki-markup-languages/
* http://mojomojo.org/documentation/textile_vs_markdown
* http://stackoverflow.com/questions/659227/compare-and-contrast-the-lightweight-markup-languages
* http://blog.codinghorror.com/the-future-of-markdown/
* http://fgallaire.flext.net/comparaison-langage-balisage-markup-lightweight-leger-txt2tags-pandoc-docutils-asciidoc-deplate-stx2any-aft-markdown-textile/
* http://www.wilfred.me.uk/blog/2012/07/30/why-markdown-is-not-my-favourite-language/
== Comparaisons ==
{| class="wikitable" width="100%"
|-
!Syntaxe
!HTML
!Markdown
!MediaWiki
|-
|Italique
|<code><nowiki><i>italique</i></nowiki></code>
|<code><nowiki>_italique_</nowiki></code>
|<code><nowiki>''italique''</nowiki></code>
|-
|Gras
|<code><nowiki><b>gras</b></nowiki></code>
|<code><nowiki>*gras*</nowiki></code>
|<code><nowiki>'''gras'''</nowiki></code>
|-
|Titre de niveau 1
|<code><nowiki><h1>titre 1</h1></nowiki></code>
|<code><nowiki># titre 1</nowiki></code><hr /><code><nowiki># titre 1 #</nowiki></code><hr /><code><nowiki>titre 1</nowiki><br /><nowiki>=======</nowiki></code>
|<code><nowiki>= titre 1 =</nowiki></code>
|-
|Titre de niveau 2
|<code><nowiki><h2>titre 2</h2></nowiki></code>
|<code><nowiki>## titre 2</nowiki></code><hr /><code><nowiki>## titre 2 ##</nowiki></code><hr /><code><nowiki>titre 2</nowiki><br /><nowiki>-------</nowiki></code>
|<code><nowiki>== titre 2 ==</nowiki></code>
|-
|Titre de niveau 3
|<code><nowiki><h3>titre 3</h3></nowiki></code>
|<code><nowiki>### titre 3</nowiki></code><hr /><code><nowiki>### titre 3 ###</nowiki></code>
|<code><nowiki>=== titre 3 ===</nowiki></code>
|-
|Titre de niveau 4
|<code><nowiki><h4>titre 4</h4></nowiki></code>
|<code><nowiki>#### titre 4</nowiki></code><hr /><code><nowiki>#### titre 4 ####</nowiki></code>
|<code><nowiki>==== titre 4 ====</nowiki></code>
|-
|Titre de niveau 5
|<code><nowiki><h5>titre 5</h5></nowiki></code>
|<code><nowiki>##### titre 5</nowiki></code><hr /><code><nowiki>##### titre 5 #####</nowiki></code>
|<code><nowiki>===== titre 5 =====</nowiki></code>
|-
|Titre de niveau 6
|<code><nowiki><h6>titre 6</h6></nowiki></code>
|<code><nowiki>###### titre 6</nowiki></code><hr /><code><nowiki>###### titre 6 ######</nowiki></code>
|<code><nowiki>====== titre 6 ======</nowiki></code>
|-
|Titre de niveau 7
|<nowiki>-</nowiki>
|<nowiki>-</nowiki>
|<nowiki>-</nowiki>
|-
|Liste à puces
|<code><nowiki><ul></nowiki><br /><nowiki> <li>point 1</li></nowiki><br /><nowiki> <li>point 2</li></nowiki><br /><nowiki></ul></nowiki></code>
|<code><br /><nowiki>- point 1</nowiki><br /><nowiki>- point 2</nowiki></code><hr /><code><br /><nowiki>* point 1</nowiki><br /><nowiki>* point 2</nowiki></code>
|<code><nowiki>* point 1</nowiki><br /><nowiki>* point 2</nowiki></code>
|-
|Liste numérotée
|<code><nowiki><ol></nowiki><br /><nowiki> <li>point 1</li></nowiki><br /><nowiki> <li>point 2</li></nowiki><br /><nowiki></ol></nowiki></code>
|<code><br /><nowiki>1. point 1</nowiki><br /><nowiki>2. point 2</nowiki></code>
|<code><nowiki># point 1</nowiki><br /><nowiki># point 2</nowiki></code>
|-
|<code><nowiki></nowiki></code>
|<code><nowiki></nowiki></code>
|<code><nowiki></nowiki></code>
|}
d736f346b9ac6d20d0d9f45e1ebcabcb43f3074d
4
3
2014-09-07T11:05:57Z
Seb35
1
/* Comparaisons */
wikitext
text/x-wiki
== Ressources ==
L’article Wikipédia en anglais "[https://en.wikipedia.org/wiki/Lightweight_markup_language Lightweight markup language]" est bien fait et compare les différentes syntaxes.
Autres avis ci et là :
* http://dubroy.com/blog/on-wiki-markup-languages/
* http://mojomojo.org/documentation/textile_vs_markdown
* http://stackoverflow.com/questions/659227/compare-and-contrast-the-lightweight-markup-languages
* http://blog.codinghorror.com/the-future-of-markdown/
* http://fgallaire.flext.net/comparaison-langage-balisage-markup-lightweight-leger-txt2tags-pandoc-docutils-asciidoc-deplate-stx2any-aft-markdown-textile/
* http://www.wilfred.me.uk/blog/2012/07/30/why-markdown-is-not-my-favourite-language/
== Comparaisons ==
=== Emphase ===
==== Italique ====
* HTML : <code><nowiki><i>italique</i></nowiki></code>
* Markdown : <code><nowiki>_italique_</nowiki></code> ou <code><nowiki>*italique*</nowiki></code> (HTML = <code><nowiki><em>italique</em></nowiki></code>)
* MediaWiki : <code><nowiki>''italique''</nowiki></code>
==== Gras ====
* HTML : <code><nowiki><b>gras</b></nowiki></code>
* Markdown : <code><nowiki>__gras__</nowiki></code> ou <code><nowiki>**gras**</nowiki></code> (HTML = <code><nowiki><strong>gras</strong></nowiki></code>)
* MediaWiki : <code><nowiki>'''gras'''</nowiki></code>
=== Titres ===
==== Titre de niveau 1 ====
* HTML : <code><nowiki><h1>Titre 1</h1></nowiki></code>
* Markdown : <code><nowiki># Titre 1</nowiki></code> ou <code><nowiki># Titre 1 #</nowiki></code> ou <span style="display:inline-table; border:1px dotted grey; padding:0.1em;"><code><nowiki>Titre 1</nowiki><br /><nowiki>=======</nowiki></code></span>
* MediaWiki : <code><nowiki>= Titre 1 =</nowiki></code>
==== Titre de niveau 2 ====
* HTML : <code><nowiki><h2>Titre 2</h2></nowiki></code>
* Markdown : <code><nowiki>## Titre 2</nowiki></code> ou <code><nowiki>## Titre 2 ##</nowiki></code> ou <span style="display:inline-table; border:1px dotted grey; padding:0.1em;"><code><nowiki>Titre 2</nowiki><br /><nowiki>-------</nowiki></code></span>
* MediaWiki : <code><nowiki>== Titre 2 ==</nowiki></code>
==== Titre de niveau 3 ====
* HTML : <code><nowiki><h3>Titre 3</h3></nowiki></code>
* Markdown : <code><nowiki>### Titre 3</nowiki></code> ou <code><nowiki>### Titre 3 ###</nowiki></code>
* MediaWiki : <code><nowiki>=== Titre 3 ===</nowiki></code>
==== Titre de niveau 4 ====
* HTML : <code><nowiki><h4>Titre 4</h4></nowiki></code>
* Markdown : <code><nowiki>#### Titre 4</nowiki></code> ou <code><nowiki>#### Titre 4 ####</nowiki></code>
* MediaWiki : <code><nowiki>==== Titre 4 ====</nowiki></code>
==== Titre de niveau 5 ====
* HTML : <code><nowiki><h5>Titre 5</h5></nowiki></code>
* Markdown : <code><nowiki>##### Titre 5</nowiki></code> ou <code><nowiki>##### Titre 5 #####</nowiki></code>
* MediaWiki : <code><nowiki>===== Titre 5 =====</nowiki></code>
==== Titre de niveau 6 ====
* HTML : <code><nowiki><h6>Titre 6</h6></nowiki></code>
* Markdown : <code><nowiki>###### Titre 6</nowiki></code> ou <code><nowiki>###### Titre 6 ######</nowiki></code>
* MediaWiki : <code><nowiki>====== Titre 6 ======</nowiki></code>
==== Titre de niveau 7 ====
* HTML : néant
* Markdown : néant
* MediaWiki : néant
==== Titre de niveau n ====
* HTML : néant
* Markdown : néant
* MediaWiki : néant
=== Listes ===
==== Liste à puces ====
* HTML : <span style="display:inline-table; border:1px dotted grey; padding:0.1em;"><code><nowiki><ul></nowiki><br /><nowiki> <li>point 1</li></nowiki><br /><nowiki> <li>point 2</li></nowiki><br /><nowiki></ul></nowiki></code></span>
* Markdown : <span style="display:inline-table;"><span style="display:inline-table; border:1px dotted grey; padding:0.1em;"><code><span style="color:grey;">(ligne blanche)</span><br /><nowiki>* point 1</nowiki><br /><nowiki>* point 2</nowiki></code></span> <span style="display:inline-table; border:1px dotted grey; padding:0.1em;"><code><span style="color:grey;">(ligne blanche)</span><br /><nowiki>- point 1</nowiki><br /><nowiki>- point 2</nowiki></code></span></span>
* MediaWiki : <span style="display:inline-table; border:1px dotted grey; padding:0.1em;"><code><nowiki>* point 1</nowiki><br /><nowiki>* point 2</nowiki></code></span>
==== Liste numérotée ====
* HTML : <span style="display:inline-table; border:1px dotted grey; padding:0.1em;"><code><nowiki><ol></nowiki><br /><nowiki> <li>point 1</li></nowiki><br /><nowiki> <li>point 2</li></nowiki><br /><nowiki></ol></nowiki></code></span>
* Markdown : <span style="display:inline-table; border:1px dotted grey; padding:0.1em;"><code><span style="color:grey;">(ligne blanche)</span><br /><nowiki>1. point 1</nowiki><br /><nowiki>2. point 2</nowiki></code></span>
* MediaWiki : <span style="display:inline-table; border:1px dotted grey; padding:0.1em;"><code><nowiki># point 1</nowiki><br /><nowiki># point 2</nowiki></code></span>
fe53ca27f367c9d57653493fe9635ea771078cd6
7
4
2014-09-07T11:36:29Z
Seb35
1
+textile, découpage de la section emphase en sous-sections
wikitext
text/x-wiki
== Ressources ==
L’article Wikipédia en anglais "[https://en.wikipedia.org/wiki/Lightweight_markup_language Lightweight markup language]" est bien fait et compare les différentes syntaxes.
Autres avis ci et là :
* http://dubroy.com/blog/on-wiki-markup-languages/
* http://mojomojo.org/documentation/textile_vs_markdown
* http://stackoverflow.com/questions/659227/compare-and-contrast-the-lightweight-markup-languages
* http://blog.codinghorror.com/the-future-of-markdown/
* http://fgallaire.flext.net/comparaison-langage-balisage-markup-lightweight-leger-txt2tags-pandoc-docutils-asciidoc-deplate-stx2any-aft-markdown-textile/
* http://www.wilfred.me.uk/blog/2012/07/30/why-markdown-is-not-my-favourite-language/
== Comparaisons ==
=== Emphase ===
==== Italique ====
* HTML : <code><nowiki><i>italique</i></nowiki></code>
* Markdown : néant
* MediaWiki : <code><nowiki>''italique''</nowiki></code>
* Textile : <code><nowiki>__italique__</nowiki></code>
==== Gras ====
* HTML : <code><nowiki><b>gras</b></nowiki></code>
* Markdown : néant
* MediaWiki : <code><nowiki>'''gras'''</nowiki></code>
* Textile : <code><nowiki>**gras**</nowiki></code>
==== Emphase légère ====
* HTML : <code><nowiki><em>emphase légère</em></nowiki></code>
* Markdown : <code><nowiki>_emphase légère_</nowiki></code> ou <code><nowiki>*emphase légère*</nowiki></code>
* MediaWiki : néant
* Textile : <code><nowiki>_emphase légère_</nowiki></code>
==== Emphase forte ====
* HTML : <code><nowiki><strong>emphase forte</strong></nowiki></code>
* Markdown : <code><nowiki>__emphase forte__</nowiki></code> ou <code><nowiki>**emphase forte**</nowiki></code>
* MediaWiki : néant
* Textile : <code><nowiki>*emphase forte*</nowiki></code>
=== Titres ===
==== Titre de niveau 1 ====
* HTML : <code><nowiki><h1>Titre 1</h1></nowiki></code>
* Markdown : <code><nowiki># Titre 1</nowiki></code> ou <code><nowiki># Titre 1 #</nowiki></code> ou <span style="display:inline-table; border:1px dotted grey; padding:0.1em;"><code><nowiki>Titre 1</nowiki><br /><nowiki>=======</nowiki></code></span>
* MediaWiki : <code><nowiki>= Titre 1 =</nowiki></code>
* Textile : <code><nowiki>h1. Titre 1</nowiki></code>
==== Titre de niveau 2 ====
* HTML : <code><nowiki><h2>Titre 2</h2></nowiki></code>
* Markdown : <code><nowiki>## Titre 2</nowiki></code> ou <code><nowiki>## Titre 2 ##</nowiki></code> ou <span style="display:inline-table; border:1px dotted grey; padding:0.1em;"><code><nowiki>Titre 2</nowiki><br /><nowiki>-------</nowiki></code></span>
* MediaWiki : <code><nowiki>== Titre 2 ==</nowiki></code>
* Textile : <code><nowiki>h2. Titre 2</nowiki></code>
==== Titre de niveau 3 ====
* HTML : <code><nowiki><h3>Titre 3</h3></nowiki></code>
* Markdown : <code><nowiki>### Titre 3</nowiki></code> ou <code><nowiki>### Titre 3 ###</nowiki></code>
* MediaWiki : <code><nowiki>=== Titre 3 ===</nowiki></code>
* Textile : <code><nowiki>h3. Titre 3</nowiki></code>
==== Titre de niveau 4 ====
* HTML : <code><nowiki><h4>Titre 4</h4></nowiki></code>
* Markdown : <code><nowiki>#### Titre 4</nowiki></code> ou <code><nowiki>#### Titre 4 ####</nowiki></code>
* MediaWiki : <code><nowiki>==== Titre 4 ====</nowiki></code>
* Textile : <code><nowiki>h4. Titre 4</nowiki></code>
==== Titre de niveau 5 ====
* HTML : <code><nowiki><h5>Titre 5</h5></nowiki></code>
* Markdown : <code><nowiki>##### Titre 5</nowiki></code> ou <code><nowiki>##### Titre 5 #####</nowiki></code>
* MediaWiki : <code><nowiki>===== Titre 5 =====</nowiki></code>
* Textile : <code><nowiki>h5. Titre 5</nowiki></code>
==== Titre de niveau 6 ====
* HTML : <code><nowiki><h6>Titre 6</h6></nowiki></code>
* Markdown : <code><nowiki>###### Titre 6</nowiki></code> ou <code><nowiki>###### Titre 6 ######</nowiki></code>
* MediaWiki : <code><nowiki>====== Titre 6 ======</nowiki></code>
* Textile : <code><nowiki>h6. Titre 6</nowiki></code>
==== Titre de niveau 7 ====
* HTML : néant
* Markdown : néant
* MediaWiki : néant
* Textile : néant
==== Titre de niveau n ====
* HTML : néant
* Markdown : néant
* MediaWiki : néant
* Textile : néant
=== Listes ===
==== Liste à puces ====
* HTML : <span style="display:inline-table; border:1px dotted grey; padding:0.1em;"><code><nowiki><ul></nowiki><br /><nowiki> <li>point 1</li></nowiki><br /><nowiki> <li>point 2</li></nowiki><br /><nowiki></ul></nowiki></code></span>
* Markdown : <span style="display:inline-table;"><span style="display:inline-table; border:1px dotted grey; padding:0.1em;"><code><span style="color:grey;">(ligne blanche)</span><br /><nowiki>* point 1</nowiki><br /><nowiki>* point 2</nowiki></code></span> <span style="display:inline-table; border:1px dotted grey; padding:0.1em;"><code><span style="color:grey;">(ligne blanche)</span><br /><nowiki>- point 1</nowiki><br /><nowiki>- point 2</nowiki></code></span></span>
* MediaWiki : <span style="display:inline-table; border:1px dotted grey; padding:0.1em;"><code><nowiki>* point 1</nowiki><br /><nowiki>* point 2</nowiki></code></span>
* Textile : <span style="display:inline-table; border:1px dotted grey; padding:0.1em;"><code><nowiki>* point 1</nowiki><br /><nowiki>* point 2</nowiki></code></span>
==== Liste numérotée ====
* HTML : <span style="display:inline-table; border:1px dotted grey; padding:0.1em;"><code><nowiki><ol></nowiki><br /><nowiki> <li>point 1</li></nowiki><br /><nowiki> <li>point 2</li></nowiki><br /><nowiki></ol></nowiki></code></span>
* Markdown : <span style="display:inline-table; border:1px dotted grey; padding:0.1em;"><code><span style="color:grey;">(ligne blanche)</span><br /><nowiki>1. point 1</nowiki><br /><nowiki>2. point 2</nowiki></code></span>
* MediaWiki : <span style="display:inline-table; border:1px dotted grey; padding:0.1em;"><code><nowiki># point 1</nowiki><br /><nowiki># point 2</nowiki></code></span>
* Textile : <span style="display:inline-table; border:1px dotted grey; padding:0.1em;"><code><nowiki># point 1</nowiki><br /><nowiki># point 2</nowiki></code></span>
2a2b3d636acf3b17acc93bdf1279a63ebf1cfc96
MediaWiki:Common.css
8
4
5
2014-09-07T11:20:02Z
Seb35
1
Contenu en couleur noire et non grise
css
text/css
/* Contenu en couleur noire et non grise */
div#content {
color: black;
}
c192b321ce6ee0a2598fc1728430dc8dd7f956e8
6
5
2014-09-07T11:22:34Z
Seb35
1
Code en couleur grise
css
text/css
/* Contenu en couleur noire et non grise */
div#content {
color: black;
}
/* Code en couleur grise */
pre, code, tt, kbd, samp, .mw-code {
color: #252525;
}
cc4a0dce0ee85eef19d9070126a132a367eba7d6
29
6
2014-12-12T12:00:30Z
Seb35
1
+source sql (test)
css
text/css
/* Contenu en couleur noire et non grise */
div#content {
color: black;
}
/* Code en couleur grise */
pre, code, tt, kbd, samp, .mw-code {
color: #252525;
}
/* Source SQL */
div.source-sql {
padding-left: 1em;
text-indent: -1em;
}
div.source-sql br {
padding-left: 1em;
}
970b406a6c89d0bd00c5836502aeda59c783598f
30
29
2014-12-12T12:04:21Z
Seb35
1
source sql (test)
css
text/css
/* Contenu en couleur noire et non grise */
div#content {
color: black;
}
/* Code en couleur grise */
pre, code, tt, kbd, samp, .mw-code {
color: #252525;
}
/* Source SQL */
div.source-sql {
padding-left: 1em;
text-indent: -1em;
}
div.source-sql br+span {
padding-left: -1em;
}
01175b4fd5c83c31cd5dbd8691495b212f665394
32
30
2014-12-12T12:10:44Z
Seb35
1
source sql (test)
css
text/css
/* Contenu en couleur noire et non grise */
div#content {
color: black;
}
/* Code en couleur grise */
pre, code, tt, kbd, samp, .mw-code {
color: #252525;
}
/* Source SQL */
div.source-sql {
padding-left: 1em;
text-indent: -1em;
}
div.source-sql br + span {
padding-left: -1em;
}
401ea1e99f42f6efd492fe0998d17bca3f03787d
33
32
2014-12-12T12:12:44Z
Seb35
1
source sql (test)
css
text/css
/* Contenu en couleur noire et non grise */
div#content {
color: black;
}
/* Code en couleur grise */
pre, code, tt, kbd, samp, .mw-code {
color: #252525;
}
/* Source SQL */
div.source-sql::first-line {
padding-left: 1em;
text-indent: -1em;
}
638d8a5b45253cef869e70c2335632cf88723d47
34
33
2014-12-12T12:35:15Z
Seb35
1
retrait source sql
css
text/css
/* Contenu en couleur noire et non grise */
div#content {
color: black;
}
/* Code en couleur grise */
pre, code, tt, kbd, samp, .mw-code {
color: #252525;
}
cc4a0dce0ee85eef19d9070126a132a367eba7d6
Projet:Gestionnaire de mots de passe distribué
100
5
8
2014-09-08T12:53:18Z
Seb35
1
init
wikitext
text/x-wiki
Le '''gestionnaire de mots de passe distribué''' (nom temporaire) est un projet de gestionnaire de mots de passe, libre, portable, partagé, décentralisé, sécurisé et facile d’utilisation.
Plus en détails :
* <u>gestionnaire de mots de passe :</u> permet de stocker des mots de passe, personnels ou communs à plusieurs personnes
* <u>libre :</u> logiciel libre (probablement sous licence WTFPL)
* <u>portable :</u> utilisable sur ordinateur et tablettes (Windows, Mac, Linux, autres) et smartphone (Android, Firefox OS, iOS, autres) par l’utilisation de la technologie HTML5
* <u>partagé :</u> permet le partage (ou pas) des mots de passe entre plusieurs personnes
* <u>décentralisé :</u> possibilité de stocker les mots de passe sur son ordinateur/smartphone, ou sur un serveur à distance (personnel ou nuage, fortement recommandé pour les mots de passe partagés)
* <u>sécurisé :</u> utilisant le chiffrement et signature OpenPGP (standard) et le protocole Git pour la traçabilité (standard ''de facto'')
* <u>facile d’utilisation :</u> (autant que possible) interface épurée et personnalisable, traduit dans plusieurs langues, accessible
== Technologies utilisées ==
8b18230c8073c7b2073cc38918601604c24b68da
9
8
2014-09-08T14:32:36Z
Seb35
1
+modèle de menace
wikitext
text/x-wiki
Le '''gestionnaire de mots de passe distribué''' (nom temporaire) est un projet de gestionnaire de mots de passe, libre, portable, partagé, décentralisé, sécurisé et facile d’utilisation.
Plus en détails :
* <u>gestionnaire de mots de passe :</u> permet de stocker des mots de passe (ou d’autres secrets), personnels ou communs à plusieurs personnes, l’accès se faisant avec un mot de passe central
* <u>libre :</u> logiciel libre (probablement sous licence WTFPL)
* <u>portable :</u> utilisable sur ordinateur et tablettes (Windows, Mac, Linux, autres) et smartphone (Android, Firefox OS, iOS, autres) par l’utilisation de la technologie HTML5
* <u>partagé :</u> permet le partage (ou pas) des mots de passe entre plusieurs personnes
* <u>décentralisé :</u> possibilité de stocker les mots de passe sur son ordinateur/smartphone, ou sur un serveur à distance (personnel ou nuage, fortement recommandé pour les mots de passe partagés)
* <u>sécurisé :</u> utilisant le chiffrement et signature OpenPGP (standard) et le protocole Git pour la traçabilité (standard ''de facto'')
* <u>facile d’utilisation :</u> (autant que possible) interface épurée et personnalisable, traduit dans plusieurs langues, accessible, avec une documentation simple (et plus complète), idéalement ce logiciel remplirait automatiquement les champs "mots de passe" sur les sites
== Technologies utilisées ==
* HTML5 + JavaScript : pour la portabilité
* Git : pour la traçabilité / évolution
* OpenPGP : pour la sécurité
* AngularJS : pour l’interface
* YAML : pour le format de stockage
* packaging : propre à chaque plate-forme, node.js pour les serveurs
== Architecture ==
En trois blocs logiciels principaux (architecture SOA) :
* interface utilisateur
* serveur de point de contact
* infrastructure de stockage
Les trois blocs logiciels sont implémentés en JavaScript et peuvent être répartis sur plusieurs machines ou être entièrement locaux sur une machine. Les scénarios possibles sont :
* interface utilisateur sur un ordinateur/smartphone, discutant avec un serveur distant propre à la société, stockant les informations dans un nuage ou en local sur le serveur
* entièrement local sur un ordinateur/smartphone
* interface utilisateur disponible sur un site web sécurisé (privé ou public), dont le serveur sert de fait de point de contact, avec un stockage sur ce même serveur ou dans un nuage
== Sécurité ==
=== Modèle de menace ===
Le protocole de chiffrement et signature OpenPGP ainsi que les méthodes cryptographiques, sous-jacentes ou annexes, sont supposés sûrs (par définition : pas de logiciel espion, code source non-falsifié, pas de bugs mettant en péril la sécurité). Les implémentations des logiciels tiers sont supposées sûrs. Le logiciel est supposé être à jour. L’utilisateur ne doit pas passer outre les alertes de sécurité indiquées.
La machine cliente et celle comportant l’interface utilisateur sont supposées sûres. Le serveur de point de contact et l’infrastructure de stockage peuvent ne pas être complètement sûrs, mais leur défaillance (opérationnelle ou liée à la sécurité) empêcheront le partage des mots de passe.
L’accès au logiciel se fait au moyen d’un mot de passe ou de toute autre méthode, et son accès non-autorisé est supposé hors du périmètre du logiciel. Lors du partage de mots de passe, il est supposé que l’utilisateur, identifié par une clé OpenPGP, a confiance en les clés OpenPGP des autres utilisateurs de façon à pouvoir les identifier de façon certaine, et il lui appartient donc de régler comme il l’entend les paramètres de profondeur de sa toile de confiance OpenPGP ; la non-confiance de l’utilisateur en sa toile de confiance OpenPGP est hors du périmètre du logiciel. La reconstruction du graphe social des utilisateurs d’un point de contact est supposé hors du périmètre du logiciel.
=== Compléments au modèle de menace ===
La sûreté affirmée dans le modèle de menace permet de s’affranchir des problèmes non-liés directement au logiciel, mais il est bien sûr entendu qu’il sera fait au mieux pour assurer la meilleure sécurité globale au logiciel, notamment par :
* le suivi de la sécurité des méthodes de cryptographie,
* le suivi des mises à jour des logiciels tiers directement utilisés,
* l’utilisation de méthodes verouillant l’accès au logiciel pour prévenir son utilisation non-autorisée,
* la minimisation du nombre d’alertes de sécurité à celles d’une grande importance et la meilleure explication des alertes en question.
Si un groupe d’utilisateurs partageant un ensemble de mots de passe ne veut pas voir son graphe social devenir public, il leur appartient de prendre les mesures appropriées, notamment :
* l’utilisation d’un réseau d’anonymisation permettant à un attaquant passif écoutant le réseau de collecter les adresses IP se connectant au point de contact,
* la création d’une toile de confiance locale par la mise en place d’un serveur de clés OpenPGP privé,
* la publication ou non de leurs signatures des clés des pairs.
La création d’une toile de confiance locale (par la mise en place d’un serveur de clés OpenPGP privé) peut également servir à une installation autonome, solutionant des débats sur la publication ou non du graphe social, et facilitant l’intégration avec un système d’authentification déjà en place. Par ailleurs, par simplification pour les utilisateurs, il peut être créé, au sein d’un point de contact ou pas, une clé OpenPGP centrale (détenue par un administrateur de confiance) qui authentifierait et signerait l’ensemble des clés du point de contact ou d’une communauté et dont les utilisateurs seraient supposés avoir confiance ; cela faciliterait la création d’une communauté de confiance.
a0665572622da4c628b56f0f67e336c966c757eb
Tutorial:Packaging de WebApps
102
6
10
2014-09-09T12:59:13Z
Seb35
1
init
wikitext
text/x-wiki
== Packaged Web Apps (Widgets) ==
* Specification: http://www.w3.org/TR/widgets/
* Directory structure:<table class="wikitable"><caption>Reserved File Names Table</caption><tr><th>file name</th><th>type</th><th>reserved for purpose</th></tr><tr><td>config.xml</td><td>file</td><td>Configuration document</td></tr><tr><td>icon.png</td><td>file</td><td>Default icon</td></tr><tr><td>icon.gif</td><td>file</td><td>Default icon</td></tr><tr><td>icon.jpg</td><td>file</td><td>Default icon</td></tr><tr><td>icon.ico</td><td>file</td><td>Default icon</td></tr><tr><td>icon.svg</td><td>file</td><td>Default icon</td></tr><tr><td>index.html</td><td>file</td><td>Default start file</td></tr><tr><td>index.htm</td><td>file</td><td>Default start file</td></tr><tr><td>index.svg</td><td>file</td><td>Default start file</td></tr><tr><td>index.xhtml</td><td>file</td><td>Default start file</td></tr><tr><td>index.xht</td><td>file</td><td>Default start file</td></tr><tr><td>locales</td><td>folder</td><td>Container for localized content</td></tr></table>
* Package:
** Extension: .wgt
** MIME type: application/widget
** Archive: ZIP file
** Manifest: config.xml (see specification)
== Firefox OS / Firefox Apps ==
* Documentation: https://developer.mozilla.org/en-US/Apps/Quickstart
* Directory structure:<table class="wikitable"><caption>Reserved File Names Table</caption><tr><th>file name</th><th>type</th><th>reserved for purpose</th></tr><tr><td>manifest.webapp</td><td>file</td><td>Manifest document</td></tr><tr><td>index.html</td><td>file</td><td>Default start file</td></table>
* Package:
** Archive: Web hosting or ZIP file
** Manifest: manifest.webapp
0a0f391017e4bb25714fff950d5b4653ac3e4256
11
10
2014-09-09T13:22:43Z
Seb35
1
+header, +manifest for web apps and bookmarks (W3C WD)
wikitext
text/x-wiki
List and comparison of various webapps packaging, with the aim at finding commonalities and differencies to create a directory structure compatible with a largest set of deployment targets. (Possibly if there are uncompatible directory structures between two deployment targets, it will be up to the developer to choose what target s/he prefers.)
== Packaged Web Apps (Widgets) ==
* Status: W3C Recommandation
* Specification: http://www.w3.org/TR/widgets/
* Directory structure:<table class="wikitable"><caption>Reserved File Names Table</caption><tr><th>file name</th><th>type</th><th>reserved for purpose</th></tr><tr><td>config.xml</td><td>file</td><td>Configuration document</td></tr><tr><td>icon.png</td><td>file</td><td>Default icon</td></tr><tr><td>icon.gif</td><td>file</td><td>Default icon</td></tr><tr><td>icon.jpg</td><td>file</td><td>Default icon</td></tr><tr><td>icon.ico</td><td>file</td><td>Default icon</td></tr><tr><td>icon.svg</td><td>file</td><td>Default icon</td></tr><tr><td>index.html</td><td>file</td><td>Default start file</td></tr><tr><td>index.htm</td><td>file</td><td>Default start file</td></tr><tr><td>index.svg</td><td>file</td><td>Default start file</td></tr><tr><td>index.xhtml</td><td>file</td><td>Default start file</td></tr><tr><td>index.xht</td><td>file</td><td>Default start file</td></tr><tr><td>locales</td><td>folder</td><td>Container for localized content</td></tr></table>
* Package:
** Extension: .wgt
** MIME type: application/widget
** Archive: ZIP file
** Manifest: config.xml (see specification)
== Firefox OS / Firefox Apps ==
* Status: Industry specification
* Documentation: https://developer.mozilla.org/en-US/Apps/Quickstart
* Directory structure:<table class="wikitable"><caption>Reserved File Names Table</caption><tr><th>file name</th><th>type</th><th>reserved for purpose</th></tr><tr><td>manifest.webapp</td><td>file</td><td>Manifest document</td></tr><tr><td>index.html</td><td>file</td><td>Default start file</td></table>
* Package:
** Archive: Web hosting or ZIP file
** Manifest: manifest.webapp (see documentation)
== Manifest for web apps and bookmarks ==
* Status: W3C Working Draft
* Working draft: http://www.w3.org/TR/appmanifest/
* Package:
** Extension: N/A
** MIME type: N/A
** Archive: N/A
** Manifest: any name
** Manifest fetching method: <link ref="manifest" href="..." />
* Manifest:
** Extension: .json, .manifest
** MIME type: application/manifest+json
** Format: JSON
6a2fe1ce1923598c0bad4ff24b253eadfcd48e04
12
11
2014-09-09T14:40:38Z
Seb35
1
+HTML5 cache
wikitext
text/x-wiki
List and comparison of various webapps packaging, with the aim at finding commonalities and differencies to create a directory structure compatible with a largest set of deployment targets. (Possibly if there are uncompatible directory structures between two deployment targets, it will be up to the developer to choose what target s/he prefers.)
== HTML5 ==
* Status: W3C Candidate Recommandation
* Specification: http://www.w3.org/TR/html5/
* Package:
** Extension:
** MIME type:
** Format:
** Manifest: *.appcache
* Cache manifest:
** Extension: .appcache
** MIME type: text/cache-manifest
** Format: text
== Packaged Web Apps (Widgets) ==
* Status: W3C Recommandation
* Specification: http://www.w3.org/TR/widgets/
* Directory structure:<table class="wikitable"><caption>Reserved File Names Table</caption><tr><th>file name</th><th>type</th><th>reserved for purpose</th></tr><tr><td>config.xml</td><td>file</td><td>Configuration document</td></tr><tr><td>icon.png</td><td>file</td><td>Default icon</td></tr><tr><td>icon.gif</td><td>file</td><td>Default icon</td></tr><tr><td>icon.jpg</td><td>file</td><td>Default icon</td></tr><tr><td>icon.ico</td><td>file</td><td>Default icon</td></tr><tr><td>icon.svg</td><td>file</td><td>Default icon</td></tr><tr><td>index.html</td><td>file</td><td>Default start file</td></tr><tr><td>index.htm</td><td>file</td><td>Default start file</td></tr><tr><td>index.svg</td><td>file</td><td>Default start file</td></tr><tr><td>index.xhtml</td><td>file</td><td>Default start file</td></tr><tr><td>index.xht</td><td>file</td><td>Default start file</td></tr><tr><td>locales</td><td>folder</td><td>Container for localized content</td></tr></table>
* Package:
** Extension: .wgt
** MIME type: application/widget
** Format: ZIP file
** Manifest: config.xml (see specification)
== Firefox OS / Firefox Apps ==
* Status: Industry specification
* Documentation: https://developer.mozilla.org/en-US/Apps/Quickstart
* Directory structure:<table class="wikitable"><caption>Reserved File Names Table</caption><tr><th>file name</th><th>type</th><th>reserved for purpose</th></tr><tr><td>manifest.webapp</td><td>file</td><td>Manifest document</td></tr><tr><td>index.html</td><td>file</td><td>Default start file</td></table>
* Package:
** Format: Web hosting or ZIP file
** Manifest: manifest.webapp (see documentation)
== Manifest for web apps and bookmarks ==
* Status: W3C Working Draft
* Working draft: http://www.w3.org/TR/appmanifest/
* Package:
** Extension: N/A
** MIME type: N/A
** Format: N/A
** Manifest: *
** Manifest fetching method: <link ref="manifest" href="..." />
* Manifest:
** Extension: .json, .manifest
** MIME type: application/manifest+json
** Format: JSON
54b07aa493fe2d6815f413dd674dc6dab0b4e4c0
13
12
2014-09-09T20:30:05Z
Seb35
1
+opera/chromium
wikitext
text/x-wiki
List and comparison of various webapps packaging, with the aim at finding commonalities and differencies to create a directory structure compatible with a largest set of deployment targets. (Possibly if there are uncompatible directory structures between two deployment targets, it will be up to the developer to choose what target s/he prefers.)
== HTML5 ==
* Status: W3C Candidate Recommandation
* Specification: http://www.w3.org/TR/html5/
* Package:
** Extension:
** MIME type:
** Format:
** Manifest: *.appcache
* Cache manifest:
** Extension: .appcache
** MIME type: text/cache-manifest
** Format: text
== Packaged Web Apps (Widgets) ==
* Status: W3C Recommandation
* Specification: http://www.w3.org/TR/widgets/
* Directory structure:<table class="wikitable"><caption>Reserved File Names Table</caption><tr><th>file name</th><th>type</th><th>reserved for purpose</th></tr><tr><td>config.xml</td><td>file</td><td>Configuration document</td></tr><tr><td>icon.png</td><td>file</td><td>Default icon</td></tr><tr><td>icon.gif</td><td>file</td><td>Default icon</td></tr><tr><td>icon.jpg</td><td>file</td><td>Default icon</td></tr><tr><td>icon.ico</td><td>file</td><td>Default icon</td></tr><tr><td>icon.svg</td><td>file</td><td>Default icon</td></tr><tr><td>index.html</td><td>file</td><td>Default start file</td></tr><tr><td>index.htm</td><td>file</td><td>Default start file</td></tr><tr><td>index.svg</td><td>file</td><td>Default start file</td></tr><tr><td>index.xhtml</td><td>file</td><td>Default start file</td></tr><tr><td>index.xht</td><td>file</td><td>Default start file</td></tr><tr><td>locales</td><td>folder</td><td>Container for localized content</td></tr></table>
* Package:
** Extension: .wgt
** MIME type: application/widget
** Format: ZIP file
** Manifest: config.xml (see specification)
== Firefox OS / Firefox Apps ==
* Status: Industry specification
* Documentation: https://developer.mozilla.org/en-US/Apps/Quickstart
* Directory structure:<table class="wikitable"><caption>Reserved File Names Table</caption><tr><th>file name</th><th>type</th><th>reserved for purpose</th></tr><tr><td>manifest.webapp</td><td>file</td><td>Manifest document</td></tr><tr><td>index.html</td><td>file</td><td>Default start file</td></table>
* Package:
** Format: Web hosting or ZIP file
** Manifest: manifest.webapp (see documentation)
== Manifest for web apps and bookmarks ==
* Status: W3C Working Draft
* Working draft: http://www.w3.org/TR/appmanifest/
* Package:
** Extension: N/A
** MIME type: N/A
** Format: N/A
** Manifest: *
** Manifest fetching method: <link ref="manifest" href="..." />
* Manifest:
** Extension: .json, .manifest
** MIME type: application/manifest+json
** Format: JSON
== Opera 14- ==
* Status: Industry specification (deprecated)
* Package:
** Extension: .oex
** Format: ZIP file
== Chromium / Opera 15+ ==
* Status: Industry specification
* Documentation Opera: https://dev.opera.com/extensions/
* Package:
** Extension: .nex
** MIME type:
** Format: ZIP file
** Manifest: manifest.json
* Manifest:
** Filename: manifest.json
** Format: JSON
b49c05eef275bab345a74fe92a9da7f1bb999bed
Projet:Gestionnaire de mots de passe distribué/Bibliothèques
100
7
14
2014-10-04T11:00:02Z
Seb35
1
bibliothèque
wikitext
text/x-wiki
== Commun ==
* Lecture YAML : [https://www.npmjs.org/package/js-yaml js-yaml] (node + browser)
* OpenPGP : [http://openpgpjs.org/ OpenPGPjs]
* Git : [https://github.com/creationix/js-git js-git]
== Interface client graphique ==
* Interface client : [https://www.angularjs.org AngularJS]
* Arborescence (AngularJS) : [http://ngmodules.org/modules/angular.treeview angular.treeview]
== Serveur de point de contact ==
* [http://www.nodejs.org Node.js]
== Infrastructure de stockage ==
* NodeJS require('fs')
* [https://www.dropbox.com/developers Dropbox API]
5ea8c946aa4da50e127ea49bab249d419682de7a
Fichier:Archéo Lex.png
6
8
15
2014-11-26T20:38:28Z
Seb35
1
Licence : WTFPL 2.0
wikitext
text/x-wiki
Licence : WTFPL 2.0
92d44f42c0999c70686499365fee05dcd20f3216
Tutorial:Beautiful MediaWiki URLs
102
178
16
2014-11-26T23:36:26Z
Seb35
1
first part
wikitext
text/x-wiki
This page is about configurating beautiful, pure URLs for MediaWiki, basically without any visible "index.php". The reasoning is that this syntax "index.php" is not interesting from the user’s point of view, and it’s ugly, so it shouldn’t be there.
This wiki implements these rules. Technically, this comes from [[:enwikipedia:Common Gateway Interface|CGI scripts]], and this have to be taken into account to configure the server. Thereafter is the configuration to achieve that with [[:enwikipedia:nginx|nginx]].
== Prerequisites ==
* A server
* MediaWiki on this server in the directory, say, '/mediawiki'
* nginx, preferably with the module Lua
== MediaWiki configuration ==
In the file LocalSettings.php, add the following directives at the end.
Remove the "script path" to remove all subdirectories.
$wgScriptPath = '';
Set the article path to its simplest form. With this, links to view the articles will be beautiful.
$wgArticlePath = '/$1';
Now, true improvements begin. When you view an article, the URL is beautiful, but it becomes again ugly when you edit an article or ask its printable form. So let’s remove the "index.php".
$wgScript = '';
The links for the actions have the form "/Main_Page?title=Main_Page&action=edit" for the edit action. You can remark the title is displayed twice. To remove this, we have to add a small hook in LocalSettings.php to remove the "title=" parameter.
$wgHooks['GetLocalURL::Internal'][] = 'urlPhpAgnostic';
function urlPhpAgnostic( &$title, &$url, $query ) {
global $wgArticlePath;
$url = str_replace( '$1', wfUrlencode( $title->getPrefixedDBkey() ), $wgArticlePath );
while ( preg_match( '/^(.*&|)title=([^&]*)(&.*|)$/', $query, $matches ) ) {
$query = $matches[1] . $matches[3];
}
if ( $query != '' ) {
$url = wfAppendQuery( $url, $query );
}
}
ba04c2e2a497d4b5290819601e07fab1b76be931
17
16
2014-11-27T00:04:35Z
Seb35
1
second part
wikitext
text/x-wiki
This page is about configurating beautiful, pure URLs for MediaWiki, basically without any visible "index.php". The reasoning is that this syntax "index.php" is not interesting from the user’s point of view, and it’s ugly, so it shouldn’t be there.
This wiki implements these rules. Technically, this comes from [[:enwikipedia:Common Gateway Interface|CGI scripts]], and this have to be taken into account to configure the server. Thereafter is the configuration to achieve that with [[:enwikipedia:nginx|nginx]].
== Prerequisites ==
* A server
* MediaWiki, in the directory, say, '/mediawiki'
* nginx, preferably with the module Lua
== MediaWiki configuration ==
In the file LocalSettings.php, add the following directives at the end.
Remove the "script path" to remove all subdirectories.
$wgScriptPath = '';
Set the article path to its simplest form. With this, links to view the articles will be beautiful.
$wgArticlePath = '/$1';
Now, true improvements begin. When you view an article, the URL is beautiful, but it becomes again ugly when you edit an article or ask its printable form. So let’s remove the "index.php".
$wgScript = '';
The links for the actions have the form "/Main_Page?title=Main_Page&action=edit" for the edit action. You can remark the title is displayed twice. To remove this, we have to add a small hook in LocalSettings.php to remove the "title=" parameter.
$wgHooks['GetLocalURL::Internal'][] = 'urlPhpAgnostic';
function urlPhpAgnostic( &$title, &$url, $query ) {
global $wgArticlePath;
$url = str_replace( '$1', wfUrlencode( $title->getPrefixedDBkey() ), $wgArticlePath );
while ( preg_match( '/^(.*&|)title=([^&]*)(&.*|)$/', $query, $matches ) ) {
$query = $matches[1] . $matches[3];
}
if ( $query != '' ) {
$url = wfAppendQuery( $url, $query );
}
}
== Nginx configuration ==
The basic skeleton is just below. We will then add 'location' directives.
server {
listen 80;
listen 443 ssl;
server_name my-wiki.example;
root /mediawiki;
# 'location' directives to be added here
}
First, let’s add simple things: backend PHP scripts (I don’t search to hide them, they are backend so not viewed by human users).
location ~ ^/(api|load|opensearch_desc)\.php$ {
include php5-fpm.conf;
}
Next, the more important thing: the call to index.php to catch all actions and transmit them to MediaWiki.
location / {
if ($arg_title != '') {
set_by_lua $mwredirect '
local args = ngx.var.args
local arg_title = ngx.var.arg_title
arg_title = ngx.re.gsub(arg_title, "%3A", ":")
arg_title = ngx.re.gsub(arg_title, "%20", "_")
arg_title = ngx.re.gsub(arg_title, "[+]", "_")
local url = "/" .. arg_title
newargs, n, err = ngx.re.gsub(args, [[\btitle=[^&]*&?]], "", "jo")
if string.len(newargs) > 0 then
url = url .. "?" ..newargs
end
if string.sub(url, -1) == "&" then
url = string.sub(url, 1, -2)
end
return url
';
return 301 $mwredirect;
}
include php5-fpm.conf;
fastcgi_split_path_info ^(/)(.*)$;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
The normal scenario, at the end of the location /, split the first part of the URL (only the slash) and the title of the article, transmitted to PHP/MediaWiki via the FastCGI parameter PATH_INFO. The first part of the location / rewrite remaining "title=" which can still be found in MediaWiki in the forms (Special:Recentchanges, Special:Log, etc.) -- AFAIK there is no way to improve this directly in MediaWiki without modifying the core (which is bad because it adds work for the updates).
Now, you should have a quite functional wiki, apart some missing images. Let’s add the UI images from the /skins subdirectory and the /extensions subdirectory at the same time (some extensions have JavaScript files or image files in their directories). Here are allowed only: the JS files, the images, the CSS and LESS files, and .htc files (used by IE).
location ~ ^/(extensions|skins)/ {
location ~ \.(js|css|htc|less|png|svg|gif|jpg|xcf)$ {
allow all;
try_files $uri =403;
}
deny all;
}
Now we can allow integrated files of the /images subdirectory. Below are two variants depending if your wiki is public or private.
location ~ ^/images/ {
# Publicly accessible files
location ~ ^/images/(\.htaccess|README|lockdir.*)$ {
return 404;
}
location ~ /$ {
deny all;
}
try_files $uri =404;
# Private files for a private wiki
#include php5-fpm.conf;
#fastcgi_split_path_info ^(/images/)(.*)$;
#fastcgi_param SCRIPT_FILENAME $document_root/img_auth.php;
#fastcgi_param PATH_INFO $fastcgi_path_info;
}
To finish, we can add /robots.txt and /favicon.ico if they are not managed by MediaWiki extensions.
location ~ ^/(robots.txt|favicon.ico)$ {
try_files $uri =404;
}
4886f1411b5a36524212caff4a765a02586e445c
18
17
2014-11-27T00:14:43Z
Seb35
1
conclusion
wikitext
text/x-wiki
This page is about configurating beautiful, pure URLs for MediaWiki, basically without any visible "index.php". The reasoning is that this syntax "index.php" is not interesting from the user’s point of view, and it’s ugly, so it shouldn’t be there.
This wiki implements these rules. Technically, this comes from [[:enwikipedia:Common Gateway Interface|CGI scripts]], and this have to be taken into account to configure the server. Thereafter is the configuration to achieve that with [[:enwikipedia:nginx|nginx]].
== Prerequisites ==
* A server
* MediaWiki, in the directory, say, '/mediawiki'
* nginx, preferably with the module Lua
== MediaWiki configuration ==
In the file LocalSettings.php, add the following directives at the end.
Remove the "script path" to remove all subdirectories.
$wgScriptPath = '';
Set the article path to its simplest form. With this, links to view the articles will be beautiful.
$wgArticlePath = '/$1';
Now, true improvements begin. When you view an article, the URL is beautiful, but it becomes again ugly when you edit an article or ask its printable form. So let’s remove the "index.php".
$wgScript = '';
The links for the actions have the form "/Main_Page?title=Main_Page&action=edit" for the edit action. You can remark the title is displayed twice. To remove this, we have to add a small hook in LocalSettings.php to remove the "title=" parameter.
$wgHooks['GetLocalURL::Internal'][] = 'urlPhpAgnostic';
function urlPhpAgnostic( &$title, &$url, $query ) {
global $wgArticlePath;
$url = str_replace( '$1', wfUrlencode( $title->getPrefixedDBkey() ), $wgArticlePath );
while ( preg_match( '/^(.*&|)title=([^&]*)(&.*|)$/', $query, $matches ) ) {
$query = $matches[1] . $matches[3];
}
if ( $query != '' ) {
$url = wfAppendQuery( $url, $query );
}
}
== Nginx configuration ==
The basic skeleton is just below. We will then add 'location' directives.
server {
listen 80;
listen 443 ssl;
server_name my-wiki.example;
root /mediawiki;
# 'location' directives to be added here
}
First, let’s add simple things: backend PHP scripts (I don’t search to hide them, they are backend so not viewed by human users).
location ~ ^/(api|load|opensearch_desc)\.php$ {
include php5-fpm.conf;
}
Next, the more important thing: the call to index.php to catch all actions and transmit them to MediaWiki.
location / {
if ($arg_title != '') {
set_by_lua $mwredirect '
local args = ngx.var.args
local arg_title = ngx.var.arg_title
arg_title = ngx.re.gsub(arg_title, "%3A", ":")
arg_title = ngx.re.gsub(arg_title, "%20", "_")
arg_title = ngx.re.gsub(arg_title, "[+]", "_")
local url = "/" .. arg_title
newargs, n, err = ngx.re.gsub(args, [[\btitle=[^&]*&?]], "", "jo")
if string.len(newargs) > 0 then
url = url .. "?" ..newargs
end
if string.sub(url, -1) == "&" then
url = string.sub(url, 1, -2)
end
return url
';
return 301 $mwredirect;
}
include php5-fpm.conf;
fastcgi_split_path_info ^(/)(.*)$;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
The normal scenario, at the end of the location /, split the first part of the URL (only the slash) and the title of the article, transmitted to PHP/MediaWiki via the FastCGI parameter PATH_INFO. The first part of the location / rewrite remaining "title=" which can still be found in MediaWiki in the forms (Special:Recentchanges, Special:Log, etc.) -- AFAIK there is no way to improve this directly in MediaWiki without modifying the core (which is bad because it adds work for the updates).
Now, you should have a quite functional wiki, apart some missing images. Let’s add the UI images from the /skins subdirectory and the /extensions subdirectory at the same time (some extensions have JavaScript files or image files in their directories). Here are allowed only: the JS files, the images, the CSS and LESS files, and .htc files (used by IE).
location ~ ^/(extensions|skins)/ {
location ~ \.(js|css|htc|less|png|svg|gif|jpg|xcf)$ {
allow all;
try_files $uri =403;
}
deny all;
}
Now we can allow integrated files of the /images subdirectory. Below are two variants depending if your wiki is public or private.
location ~ ^/images/ {
# Publicly accessible files
location ~ ^/images/(\.htaccess|README|lockdir.*)$ {
return 404;
}
location ~ /$ {
deny all;
}
try_files $uri =404;
# Private files for a private wiki
#include php5-fpm.conf;
#fastcgi_split_path_info ^(/images/)(.*)$;
#fastcgi_param SCRIPT_FILENAME $document_root/img_auth.php;
#fastcgi_param PATH_INFO $fastcgi_path_info;
}
To finish, we can add /robots.txt and /favicon.ico if they are not managed by MediaWiki extensions.
location ~ ^/(robots.txt|favicon.ico)$ {
try_files $uri =404;
}
== Conclusion ==
# Now the URLs are "/Main_Page", "/Main_Page?action=history", "/Main_Page?printable=yes", etc.
# Your articles can have a wide range of titles and are not limited by system files, e.g. you can write an article about "/Robots.txt", "/Images", "/Skins", or "Index.php" (NB: the initial capital).
# Apart whitelisted system files and subdirectories, nobody can access underlying system files, e.g. "/includes/Title.php" is considered as an article, as well as "/LocalSettings.php", so an attacker doesn’t have a direct access to the system files, s/he has to deal with MediaWiki before attacking PHP files.
a6d1baf5e262d7a257b26a5a5f5e579c6f91b366
19
18
2014-11-27T09:21:25Z
Seb35
1
polishing MW part
wikitext
text/x-wiki
This page is about configurating beautiful and pure URLs for MediaWiki, basically without any visible "index.php". For example:
<div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;">
:https://wiki.seb35.fr/Learning:Beautiful_MediaWiki_URLs?action=edit
''instead of''
:https://wiki.seb35.fr/index.php?title=Learning:Beautiful_MediaWiki_URLs&action=edit
</div>
and it is even worse in languages with non-latin alphabets:
<div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;">
:https://wiki.seb35.fr/维基百科?action=history
''instead of''
:https://wiki.seb35.fr/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history
</div>
== Rationale and introduction ==
The reasoning behind this is: The syntax "index.php" is not interesting from the user’s point of view so it shouldn’t be there; additionally the user should (want) to see understandable page names instead of %-encoded nonsense.
You can see on this wiki these rules in action. Technically, these ugly URLs come from good’ ol’ time’ of [[:enwikipedia:Common Gateway Interface|CGI scripts]] (ten years ago), but now —and since some time— it is possible to rewrite URLs on the server, added to the fact that all recent browsers display URLs with characters instead of %-encoded URLs, but still not in the parameters of the URL after the "?". So it’s time to remove this "index.php".
To reconciliate MediaWiki URLs with recent browsers, we take advantage of the "path info" capability offered by servers (here nginx) and we configure MediaWiki such that it vastly limit the rendering of ugly URLs.
== Prerequisites ==
* [https://www.mediawiki.org MediaWiki], installed in the directory, say, '/var/www/mediawiki'
* [http://nginx.com nginx], preferably with the module Lua (package nginx-extras in Debian/Ubuntu)
== MediaWiki configuration ==
It is assumed the wiki is directly served from the server root location instead of a subdirectory (e.g. <nowiki>"https://example.org/" instead of "https://example.org/tools/mywiki/"</nowiki>). In other words, the "root" directive in the nginx server is the directory itself where is installed MediaWiki (where index.php is).
The following configuration variables must be added at the end of the file LocalSettings.php, in MediaWiki directory.
1. Remove the "script path" to remove all web-visible subdirectories. This should be done accordingly with nginx configuration, or it could break the installed website.
$wgScriptPath = <nowiki>''</nowiki>;
2. Set the article path to its simplest form. With this, links leading to the 'view' action of the pages will be beautiful, instead of using "index.php". The server should support the "path info" capability —it’s the case of nginx.
$wgArticlePath = '/$1';
3. Now, true improvements begin. When you view an article, the URL is beautiful, but it becomes again ugly when you edit an article or ask its printable form. So let’s remove the "index.php".
$wgScript = <nowiki>''</nowiki>;
4. The links for the actions now have the form "/Main_Page?title=Main_Page&action=edit" for the edit action. There is still the "title=" parameter which should be removed since it is already displayed in the main part of the URL. To achieve that, we have to add a small hook in LocalSettings.php to remove the "title=" parameter.
$wgHooks['GetLocalURL::Internal'][] = 'phpAgnosticURL';
function phpAgnosticURL( $title, &$url, $query ) {
global $wgArticlePath;
$url = str_replace( '$1', wfUrlencode( $title->getPrefixedDBkey() ), $wgArticlePath );
while ( preg_match( '/^(.*&|)title=([^&]*)(&.*|)$/', $query, $matches ) ) {
$query = $matches[1] . $matches[3];
}
if ( $query != <nowiki>''</nowiki> ) {
$url = wfAppendQuery( $url, $query );
}
}
== Nginx configuration ==
The basic skeleton is just below. We will then add 'location' directives.
server {
listen 80;
listen 443 ssl;
server_name my-wiki.example;
root /var/www/mediawiki;
# 'location' directives to be added here
}
First, let’s add simple things: backend PHP scripts (I don’t search to hide them, they are backend so not viewed by human users).
location ~ ^/(api|load|opensearch_desc)\.php$ {
include php5-fpm.conf;
}
Next, the more important thing: the call to index.php to catch all actions and transmit them to MediaWiki.
location / {
if ($arg_title != <nowiki>''</nowiki>) {
set_by_lua $mwredirect '
local args = ngx.var.args
local arg_title = ngx.var.arg_title
arg_title = ngx.re.gsub(arg_title, "%3A", ":")
arg_title = ngx.re.gsub(arg_title, "%20", "_")
arg_title = ngx.re.gsub(arg_title, "[+]", "_")
local url = "/" .. arg_title
newargs, n, err = ngx.re.gsub(args, [[\btitle=[^&]*&?]], "", "jo")
if string.len(newargs) > 0 then
url = url .. "?" ..newargs
end
if string.sub(url, -1) == "&" then
url = string.sub(url, 1, -2)
end
return url
';
return 301 $mwredirect;
}
include php5-fpm.conf;
fastcgi_split_path_info ^(/)(.*)$;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
The normal scenario, at the end of the location /, split the first part of the URL (only the slash) and the title of the article, transmitted to PHP/MediaWiki via the FastCGI parameter PATH_INFO. The first part of the location / rewrite remaining "title=" which can still be found in MediaWiki in the forms (Special:Recentchanges, Special:Log, etc.) -- AFAIK there is no way to improve this directly in MediaWiki without modifying the core (which is bad because it adds work for the updates).
Now, you should have a quite functional wiki, apart some missing images. Let’s add the UI images from the /skins subdirectory and the /extensions subdirectory at the same time (some extensions have JavaScript files or image files in their directories). Here are allowed only: the JS files, the images, the CSS and LESS files, and .htc files (used by IE).
location ~ ^/(extensions|skins)/ {
location ~ \.(js|css|htc|less|png|svg|gif|jpg|xcf)$ {
allow all;
try_files $uri =403;
}
deny all;
}
Now we can allow integrated files of the /images subdirectory. Below are two variants depending if your wiki is public or private.
location ~ ^/images/ {
# Publicly accessible files
location ~ ^/images/(\.htaccess|README|lockdir.*)$ {
return 404;
}
location ~ /$ {
deny all;
}
try_files $uri =404;
# Private files for a private wiki
#include php5-fpm.conf;
#fastcgi_split_path_info ^(/images/)(.*)$;
#fastcgi_param SCRIPT_FILENAME $document_root/img_auth.php;
#fastcgi_param PATH_INFO $fastcgi_path_info;
}
To finish, we can add /robots.txt and /favicon.ico if they are not managed by MediaWiki extensions.
location ~ ^/(robots.txt|favicon.ico)$ {
try_files $uri =404;
}
== Conclusion ==
# Now the URLs are "/Main_Page", "/Main_Page?action=history", "/Main_Page?printable=yes", etc.
# Your articles can have a wide range of titles and are not limited by system files, e.g. you can write an article about "/Robots.txt", "/Images", "/Skins", or "Index.php" (NB: the initial capital).
# Apart whitelisted system files and subdirectories, nobody can access underlying system files, e.g. "/includes/Title.php" is considered as an article, as well as "/LocalSettings.php", so an attacker doesn’t have a direct access to the system files, s/he has to deal with MediaWiki before attacking PHP files.
7941e1d09ed9a44da04797da072323b78d01edb6
20
19
2014-11-27T09:27:20Z
Seb35
1
server variable
wikitext
text/x-wiki
This page is about configurating beautiful and pure URLs for MediaWiki, basically without any visible "index.php". For example:
<div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;">
:{{SERVER}}/Learning:Beautiful_MediaWiki_URLs?action=edit
''instead of''
:{{SERVER}}/index.php?title=Learning:Beautiful_MediaWiki_URLs&action=edit
</div>
and it is even worse in languages with non-latin alphabets:
<div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;">
:{{SERVER}}/维基百科?action=history
''instead of''
:{{SERVER}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history
</div>
== Rationale and introduction ==
The reasoning behind this is: The syntax "index.php" is not interesting from the user’s point of view so it shouldn’t be there; additionally the user should (want) to see understandable page names instead of %-encoded nonsense.
You can see on this wiki these rules in action. Technically, these ugly URLs come from good’ ol’ time’ of [[:enwikipedia:Common Gateway Interface|CGI scripts]] (ten years ago), but now —and since some time— it is possible to rewrite URLs on the server, added to the fact that all recent browsers display URLs with characters instead of %-encoded URLs, but still not in the parameters of the URL after the "?". So it’s time to remove this "index.php".
To reconciliate MediaWiki URLs with recent browsers, we take advantage of the "path info" capability offered by servers (here nginx) and we configure MediaWiki such that it vastly limit the rendering of ugly URLs.
== Prerequisites ==
* [https://www.mediawiki.org MediaWiki], installed in the directory, say, '/var/www/mediawiki'
* [http://nginx.com nginx], preferably with the module Lua (package nginx-extras in Debian/Ubuntu)
== MediaWiki configuration ==
It is assumed the wiki is directly served from the server root location instead of a subdirectory (e.g. <nowiki>"https://example.org/" instead of "https://example.org/tools/mywiki/"</nowiki>). In other words, the "root" directive in the nginx server is the directory itself where is installed MediaWiki (where index.php is).
The following configuration variables must be added at the end of the file LocalSettings.php, in MediaWiki directory.
1. Remove the "script path" to remove all web-visible subdirectories. This should be done accordingly with nginx configuration, or it could break the installed website.
$wgScriptPath = <nowiki>''</nowiki>;
2. Set the article path to its simplest form. With this, links leading to the 'view' action of the pages will be beautiful, instead of using "index.php". The server should support the "path info" capability —it’s the case of nginx.
$wgArticlePath = '/$1';
3. Now, true improvements begin. When you view an article, the URL is beautiful, but it becomes again ugly when you edit an article or ask its printable form. So let’s remove the "index.php".
$wgScript = <nowiki>''</nowiki>;
4. The links for the actions now have the form "/Main_Page?title=Main_Page&action=edit" for the edit action. There is still the "title=" parameter which should be removed since it is already displayed in the main part of the URL. To achieve that, we have to add a small hook in LocalSettings.php to remove the "title=" parameter.
$wgHooks['GetLocalURL::Internal'][] = 'phpAgnosticURL';
function phpAgnosticURL( $title, &$url, $query ) {
global $wgArticlePath;
$url = str_replace( '$1', wfUrlencode( $title->getPrefixedDBkey() ), $wgArticlePath );
while ( preg_match( '/^(.*&|)title=([^&]*)(&.*|)$/', $query, $matches ) ) {
$query = $matches[1] . $matches[3];
}
if ( $query != <nowiki>''</nowiki> ) {
$url = wfAppendQuery( $url, $query );
}
}
== Nginx configuration ==
The basic skeleton is just below. We will then add 'location' directives.
server {
listen 80;
listen 443 ssl;
server_name my-wiki.example;
root /var/www/mediawiki;
# 'location' directives to be added here
}
First, let’s add simple things: backend PHP scripts (I don’t search to hide them, they are backend so not viewed by human users).
location ~ ^/(api|load|opensearch_desc)\.php$ {
include php5-fpm.conf;
}
Next, the more important thing: the call to index.php to catch all actions and transmit them to MediaWiki.
location / {
if ($arg_title != <nowiki>''</nowiki>) {
set_by_lua $mwredirect '
local args = ngx.var.args
local arg_title = ngx.var.arg_title
arg_title = ngx.re.gsub(arg_title, "%3A", ":")
arg_title = ngx.re.gsub(arg_title, "%20", "_")
arg_title = ngx.re.gsub(arg_title, "[+]", "_")
local url = "/" .. arg_title
newargs, n, err = ngx.re.gsub(args, [[\btitle=[^&]*&?]], "", "jo")
if string.len(newargs) > 0 then
url = url .. "?" ..newargs
end
if string.sub(url, -1) == "&" then
url = string.sub(url, 1, -2)
end
return url
';
return 301 $mwredirect;
}
include php5-fpm.conf;
fastcgi_split_path_info ^(/)(.*)$;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
The normal scenario, at the end of the location /, split the first part of the URL (only the slash) and the title of the article, transmitted to PHP/MediaWiki via the FastCGI parameter PATH_INFO. The first part of the location / rewrite remaining "title=" which can still be found in MediaWiki in the forms (Special:Recentchanges, Special:Log, etc.) -- AFAIK there is no way to improve this directly in MediaWiki without modifying the core (which is bad because it adds work for the updates).
Now, you should have a quite functional wiki, apart some missing images. Let’s add the UI images from the /skins subdirectory and the /extensions subdirectory at the same time (some extensions have JavaScript files or image files in their directories). Here are allowed only: the JS files, the images, the CSS and LESS files, and .htc files (used by IE).
location ~ ^/(extensions|skins)/ {
location ~ \.(js|css|htc|less|png|svg|gif|jpg|xcf)$ {
allow all;
try_files $uri =403;
}
deny all;
}
Now we can allow integrated files of the /images subdirectory. Below are two variants depending if your wiki is public or private.
location ~ ^/images/ {
# Publicly accessible files
location ~ ^/images/(\.htaccess|README|lockdir.*)$ {
return 404;
}
location ~ /$ {
deny all;
}
try_files $uri =404;
# Private files for a private wiki
#include php5-fpm.conf;
#fastcgi_split_path_info ^(/images/)(.*)$;
#fastcgi_param SCRIPT_FILENAME $document_root/img_auth.php;
#fastcgi_param PATH_INFO $fastcgi_path_info;
}
To finish, we can add /robots.txt and /favicon.ico if they are not managed by MediaWiki extensions.
location ~ ^/(robots.txt|favicon.ico)$ {
try_files $uri =404;
}
== Conclusion ==
# Now the URLs are "/Main_Page", "/Main_Page?action=history", "/Main_Page?printable=yes", etc.
# Your articles can have a wide range of titles and are not limited by system files, e.g. you can write an article about "/Robots.txt", "/Images", "/Skins", or "Index.php" (NB: the initial capital).
# Apart whitelisted system files and subdirectories, nobody can access underlying system files, e.g. "/includes/Title.php" is considered as an article, as well as "/LocalSettings.php", so an attacker doesn’t have a direct access to the system files, s/he has to deal with MediaWiki before attacking PHP files.
ff1d54bf5adfb15a961b1288919788aeebba22df
21
20
2014-11-27T10:40:50Z
Seb35
1
polishing nginx part, adding "complements" part
wikitext
text/x-wiki
This page is about configurating beautiful and pure URLs for MediaWiki, basically without any visible "index.php". For example:
<div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;">
:{{SERVER}}/Learning:Beautiful_MediaWiki_URLs?action=edit
''instead of''
:{{SERVER}}/index.php?title=Learning:Beautiful_MediaWiki_URLs&action=edit
</div>
and it is even worse in languages with non-latin alphabets:
<div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;">
:{{SERVER}}/维基百科?action=history
''instead of''
:{{SERVER}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history
</div>
== Rationale and introduction ==
The reasoning behind this is: The syntax "index.php" is not interesting from the user’s point of view so it shouldn’t be there; additionally the user should (want) to see understandable page names instead of %-encoded nonsense.
You can see on this wiki these rules in action. Technically, these ugly URLs come from good’ ol’ time’ of [[:enwikipedia:Common Gateway Interface|CGI scripts]] (ten years ago), but now —and since some time— it is possible to rewrite URLs on the server, added to the fact that all recent browsers display URLs with characters instead of %-encoded URLs, but still not in the parameters of the URL after the "?". So it’s time to remove this "index.php".
To reconciliate MediaWiki URLs with recent browsers, we take advantage of the "path info" capability offered by servers (here nginx) and we configure MediaWiki such that it vastly limit the rendering of ugly URLs.
== Prerequisites ==
* [https://www.mediawiki.org MediaWiki], installed in the directory, say, '/var/www/mediawiki'
* [http://nginx.com nginx], preferably with the module Lua (package nginx-extras in Debian/Ubuntu)
* The wiki is assumed to be installed on "<nowiki>http://wiki.example.org/</nowiki>"
* The server must support the PATH_INFO directive; it is the case for most "nginx + PHP gateway" but you should really check it works before continuing, see [https://www.mediawiki.org/Special:MyLanguage/Manual:$wgUsePathInfo Manual:$wgUsePathInfo] on MediaWiki.org.
== MediaWiki configuration ==
It is assumed the wiki is directly served from the server root location instead of a subdirectory (e.g. <nowiki>"https://example.org/" instead of "https://example.org/tools/mywiki/"</nowiki>). In other words, the "root" directive in the nginx server is the directory itself where is installed MediaWiki (where index.php is).
The following configuration variables must be added at the end of the file LocalSettings.php, in MediaWiki directory.
1. Remove the "script path" to remove all web-visible subdirectories. This should be done accordingly with nginx configuration, or it could break the installed website.
$wgScriptPath = <nowiki>''</nowiki>;
2. Set the article path to its simplest form. With this, links leading to the 'view' action of the pages will be beautiful, instead of using "index.php". The server should support the "path info" capability —it’s the case of nginx.
$wgArticlePath = '/$1';
3. Now, true improvements begin. When you view an article, the URL is beautiful, but it becomes again ugly when you edit an article or ask its printable form. So let’s remove the "index.php".
$wgScript = <nowiki>''</nowiki>;
4. The links for the actions now have the form "/Main_Page?title=Main_Page&action=edit" for the edit action. There is still the "title=" parameter which should be removed since it is already displayed in the main part of the URL. To achieve that, we have to add a small hook in LocalSettings.php to remove the "title=" parameter.
$wgHooks['GetLocalURL::Internal'][] = 'phpAgnosticURL';
function phpAgnosticURL( $title, &$url, $query ) {
global $wgArticlePath;
$url = str_replace( '$1', wfUrlencode( $title->getPrefixedDBkey() ), $wgArticlePath );
while ( preg_match( '/^(.*&|)title=([^&]*)(&.*|)$/', $query, $matches ) ) {
$query = $matches[1] . $matches[3];
}
if ( $query != <nowiki>''</nowiki> ) {
$url = wfAppendQuery( $url, $query );
}
}
Basically, MediaWiki now generates beautiful URLs but nginx no more understand the URLs where there is no "title=" parameter. In the next part, we will retablish the functioning, we will completely hide the PHP system files (this improves security), and by the way permit the creation of page with almost all possible titles (e.g. you will be able to create the page "Index.php" on the wiki; it is probably useless^^, but perhaps you can be interested by titles "Skins/…").
== Nginx configuration ==
5. The basic skeleton is just below. 'location' directives will be added in the following.
server {
listen 80;
listen 443 ssl;
server_name wiki.example.org;
root /var/www/mediawiki;
# 'location' directives to be added thereafter
}
6. First, let’s add simple things: backend PHP scripts. We don’t search to hide them, they are backend so not viewed by human users, but machines must have access to these scripts.
location ~ ^/(api|load|opensearch_desc)\.php$ {
include php5-fpm.conf;
}
7. Next, the more important thing: the call to the hidden "index.php" to catch all actions and transmit them to MediaWiki. This use the PATH_INFO parameter of CGI scripts. Additionally, we add an exception for the situation where there is still a parameter "title="; it’s the case in MediaWiki forms (Special:Recentchanges, Special:Log, etc.) and it will make the whole system both backward-compatible and with beautiful URLs (a permanent redirect from the old URLs to the new URLs). The Lua rewriting part was done thanks to a [http://forum.nginx.org/read.php?2,243462,243464 agentzh’s message] (thanks!).
location / {
if ($arg_title != <nowiki>''</nowiki>) {
set_by_lua $mwredirect '
local args = ngx.var.args
local arg_title = ngx.var.arg_title
arg_title = ngx.re.gsub(arg_title, "%3A", ":")
arg_title = ngx.re.gsub(arg_title, "%20", "_")
arg_title = ngx.re.gsub(arg_title, "[+]", "_")
local url = "/" .. arg_title
newargs, n, err = ngx.re.gsub(args, [[\btitle=[^&]*&?]], "", "jo")
if string.len(newargs) > 0 then
url = url .. "?" ..newargs
end
if string.sub(url, -1) == "&" then
url = string.sub(url, 1, -2)
end
return url
';
return 301 $mwredirect;
}
include php5-fpm.conf;
fastcgi_split_path_info ^(/)(.*)$;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
8. Now, you should have a quite functional wiki, apart some missing images. Let’s add the UI images from the /skins subdirectory and the /extensions subdirectory at the same time (some extensions have JavaScript files or image files in their directories). Here are only allowed: the images, the JS files, the CSS and LESS files, and the .htc files (used by IE).
location ~ ^/(extensions|skins)/ {
location ~ \.(js|css|htc|less|png|svg|gif|jpg|xcf)$ {
allow all;
try_files $uri =403;
}
deny all;
}
9. Now we can allow integrated files of the /images subdirectory. Below are two variants depending if your wiki is public or private.
location ~ ^/images/ {
# Publicly accessible files
location ~ ^/images/(\.htaccess|README|lockdir.*)$ {
return 404;
}
location ~ /$ {
deny all;
}
try_files $uri =404;
# Private files for a private wiki
#include php5-fpm.conf;
#fastcgi_split_path_info ^(/images/)(.*)$;
#fastcgi_param SCRIPT_FILENAME $document_root/img_auth.php;
#fastcgi_param PATH_INFO $fastcgi_path_info;
}
10. To finish, we can add /robots.txt and /favicon.ico if they are not managed by MediaWiki extensions.
location ~ ^/(robots.txt|favicon.ico)$ {
try_files $uri =404;
}
== Complements ==
a. If you cannot install the Lua module in nginx, directly-entered old URLs (coming from external places like emails, other websites, user bookmarks, etc.) will work but will be displayed as old URLs ("/index.php?title=Main_Page&action=edit"). Once the user click on some link on the wiki, s/he will see new URLs.
b. To avoid MediaWiki to create URLs with remaining "title=" parameters, MediaWiki core should be patched in many places: in all forms where there is a "<nowiki><input type="hidden" name="title" … /></nowiki>" HTML tag and possibly in other places. Possibly some bug should be created, at least to give an option to natively create beautiful URLs.
c. MediaWiki update maintenance: nothing from the MediaWiki configuration side, apart if you modify MediaWiki core (it is not recommanded to facilitate updates). Probably the changed configuration parameters will stay backward-compatible for some long time since most were introduced in pre 1.1.0 MediaWiki versions. Possibly some PHP scripts must be added in the point 6 in future MediaWiki releases, see the entry points in your Special:Version page or on [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org. Possibly you can want to change the files enumerated in point 9 (this list is better from a security point of view, but this requires maintenance over time).
d. The nginx configuration above was done with strict security considerations in order to remove all entry points to system files, but this requires maintenance over time. You can want to soften these security checks:
# add more PHP scripts in point 6, see [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org
# add more media files extensions in point 8, or even acess all files in the "extensions" and "skins" subdirectories, or at the contrary blacklist some file extensions (e.g. mainly .php files)
# remove the list of files in point 9, this is probably harmless from a security point of view
e. The list in point 10 could be changed depending of specific needs. For example, you could change the location of the favicon (see [https://www.mediawiki.org/wiki/Manual:$wgFavicon $wgFavicon]), or you can add a file /sitemap.xml, etc. Additionally some MediaWiki extensions or core features propose to manage some "metadata system files" like /robots.txt or /sitemap.xml; if you want to use these features, you could have to create other "location" in nginx configuration with some wrapper to PHP file, similarly to the wrapper for "/images/" in the case of a private wiki.
== Conclusion ==
# Now the URLs are "/Main_Page", "/Main_Page?action=history", "/Main_Page?printable=yes", etc.
# Non-latin alphabets benefit of the "real characters" rendering of the browser in the URL
# The system is backward-compatible with existing URLs, and old URLs are rewritten if you have installed the Lua part in the nginx configuration.
# Your articles can have a wide range of titles and are not limited by system files, e.g. you can write an article about "/Robots.txt", "/Images", "/Skins", or "Index.php" (NB: the initial capital).
# Apart whitelisted system files and subdirectories, nobody can access to the underlying system files, e.g. "/includes/Title.php" is considered as an article, as well as "/LocalSettings.php", so an attacker doesn’t have a direct access to the system files and s/he will have to deal with MediaWiki before attacking PHP files.
b54898887917c7146dc287d0c2d721bd91eb9faf
22
21
2014-11-27T10:41:46Z
Seb35
1
wikitext
text/x-wiki
This page is about configurating beautiful and pure URLs for MediaWiki, basically without any visible "index.php". For example:
<div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;">
:{{SERVER}}/Learning:Beautiful_MediaWiki_URLs?action=edit
''instead of''
:{{SERVER}}/index.php?title=Learning:Beautiful_MediaWiki_URLs&action=edit
</div>
and it is even better in languages with non-latin alphabets:
<div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;">
:{{SERVER}}/维基百科?action=history
''instead of''
:{{SERVER}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history
</div>
== Rationale and introduction ==
The reasoning behind this is: The syntax "index.php" is not interesting from the user’s point of view so it shouldn’t be there; additionally the user should (want) to see understandable page names instead of %-encoded nonsense.
You can see on this wiki these rules in action. Technically, these ugly URLs come from good’ ol’ time’ of [[:enwikipedia:Common Gateway Interface|CGI scripts]] (ten years ago), but now —and since some time— it is possible to rewrite URLs on the server, added to the fact that all recent browsers display URLs with characters instead of %-encoded URLs, but still not in the parameters of the URL after the "?". So it’s time to remove this "index.php".
To reconciliate MediaWiki URLs with recent browsers, we take advantage of the "path info" capability offered by servers (here nginx) and we configure MediaWiki such that it vastly limit the rendering of ugly URLs.
== Prerequisites ==
* [https://www.mediawiki.org MediaWiki], installed in the directory, say, '/var/www/mediawiki'
* [http://nginx.com nginx], preferably with the module Lua (package nginx-extras in Debian/Ubuntu)
* The wiki is assumed to be installed on "<nowiki>http://wiki.example.org/</nowiki>"
* The server must support the PATH_INFO directive; it is the case for most "nginx + PHP gateway" but you should really check it works before continuing, see [https://www.mediawiki.org/Special:MyLanguage/Manual:$wgUsePathInfo Manual:$wgUsePathInfo] on MediaWiki.org.
== MediaWiki configuration ==
It is assumed the wiki is directly served from the server root location instead of a subdirectory (e.g. <nowiki>"https://example.org/" instead of "https://example.org/tools/mywiki/"</nowiki>). In other words, the "root" directive in the nginx server is the directory itself where is installed MediaWiki (where index.php is).
The following configuration variables must be added at the end of the file LocalSettings.php, in MediaWiki directory.
1. Remove the "script path" to remove all web-visible subdirectories. This should be done accordingly with nginx configuration, or it could break the installed website.
$wgScriptPath = <nowiki>''</nowiki>;
2. Set the article path to its simplest form. With this, links leading to the 'view' action of the pages will be beautiful, instead of using "index.php". The server should support the "path info" capability —it’s the case of nginx.
$wgArticlePath = '/$1';
3. Now, true improvements begin. When you view an article, the URL is beautiful, but it becomes again ugly when you edit an article or ask its printable form. So let’s remove the "index.php".
$wgScript = <nowiki>''</nowiki>;
4. The links for the actions now have the form "/Main_Page?title=Main_Page&action=edit" for the edit action. There is still the "title=" parameter which should be removed since it is already displayed in the main part of the URL. To achieve that, we have to add a small hook in LocalSettings.php to remove the "title=" parameter.
$wgHooks['GetLocalURL::Internal'][] = 'phpAgnosticURL';
function phpAgnosticURL( $title, &$url, $query ) {
global $wgArticlePath;
$url = str_replace( '$1', wfUrlencode( $title->getPrefixedDBkey() ), $wgArticlePath );
while ( preg_match( '/^(.*&|)title=([^&]*)(&.*|)$/', $query, $matches ) ) {
$query = $matches[1] . $matches[3];
}
if ( $query != <nowiki>''</nowiki> ) {
$url = wfAppendQuery( $url, $query );
}
}
Basically, MediaWiki now generates beautiful URLs but nginx no more understand the URLs where there is no "title=" parameter. In the next part, we will retablish the functioning, we will completely hide the PHP system files (this improves security), and by the way permit the creation of page with almost all possible titles (e.g. you will be able to create the page "Index.php" on the wiki; it is probably useless^^, but perhaps you can be interested by titles "Skins/…").
== Nginx configuration ==
5. The basic skeleton is just below. 'location' directives will be added in the following.
server {
listen 80;
listen 443 ssl;
server_name wiki.example.org;
root /var/www/mediawiki;
# 'location' directives to be added thereafter
}
6. First, let’s add simple things: backend PHP scripts. We don’t search to hide them, they are backend so not viewed by human users, but machines must have access to these scripts.
location ~ ^/(api|load|opensearch_desc)\.php$ {
include php5-fpm.conf;
}
7. Next, the more important thing: the call to the hidden "index.php" to catch all actions and transmit them to MediaWiki. This use the PATH_INFO parameter of CGI scripts. Additionally, we add an exception for the situation where there is still a parameter "title="; it’s the case in MediaWiki forms (Special:Recentchanges, Special:Log, etc.) and it will make the whole system both backward-compatible and with beautiful URLs (a permanent redirect from the old URLs to the new URLs). The Lua rewriting part was done thanks to a [http://forum.nginx.org/read.php?2,243462,243464 agentzh’s message] (thanks!).
location / {
if ($arg_title != <nowiki>''</nowiki>) {
set_by_lua $mwredirect '
local args = ngx.var.args
local arg_title = ngx.var.arg_title
arg_title = ngx.re.gsub(arg_title, "%3A", ":")
arg_title = ngx.re.gsub(arg_title, "%20", "_")
arg_title = ngx.re.gsub(arg_title, "[+]", "_")
local url = "/" .. arg_title
newargs, n, err = ngx.re.gsub(args, [[\btitle=[^&]*&?]], "", "jo")
if string.len(newargs) > 0 then
url = url .. "?" ..newargs
end
if string.sub(url, -1) == "&" then
url = string.sub(url, 1, -2)
end
return url
';
return 301 $mwredirect;
}
include php5-fpm.conf;
fastcgi_split_path_info ^(/)(.*)$;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
8. Now, you should have a quite functional wiki, apart some missing images. Let’s add the UI images from the /skins subdirectory and the /extensions subdirectory at the same time (some extensions have JavaScript files or image files in their directories). Here are only allowed: the images, the JS files, the CSS and LESS files, and the .htc files (used by IE).
location ~ ^/(extensions|skins)/ {
location ~ \.(js|css|htc|less|png|svg|gif|jpg|xcf)$ {
allow all;
try_files $uri =403;
}
deny all;
}
9. Now we can allow integrated files of the /images subdirectory. Below are two variants depending if your wiki is public or private.
location ~ ^/images/ {
# Publicly accessible files
location ~ ^/images/(\.htaccess|README|lockdir.*)$ {
return 404;
}
location ~ /$ {
deny all;
}
try_files $uri =404;
# Private files for a private wiki
#include php5-fpm.conf;
#fastcgi_split_path_info ^(/images/)(.*)$;
#fastcgi_param SCRIPT_FILENAME $document_root/img_auth.php;
#fastcgi_param PATH_INFO $fastcgi_path_info;
}
10. To finish, we can add /robots.txt and /favicon.ico if they are not managed by MediaWiki extensions.
location ~ ^/(robots.txt|favicon.ico)$ {
try_files $uri =404;
}
== Complements ==
a. If you cannot install the Lua module in nginx, directly-entered old URLs (coming from external places like emails, other websites, user bookmarks, etc.) will work but will be displayed as old URLs ("/index.php?title=Main_Page&action=edit"). Once the user click on some link on the wiki, s/he will see new URLs.
b. To avoid MediaWiki to create URLs with remaining "title=" parameters, MediaWiki core should be patched in many places: in all forms where there is a "<nowiki><input type="hidden" name="title" … /></nowiki>" HTML tag and possibly in other places. Possibly some bug should be created, at least to give an option to natively create beautiful URLs.
c. MediaWiki update maintenance: nothing from the MediaWiki configuration side, apart if you modify MediaWiki core (it is not recommanded to facilitate updates). Probably the changed configuration parameters will stay backward-compatible for some long time since most were introduced in pre 1.1.0 MediaWiki versions. Possibly some PHP scripts must be added in the point 6 in future MediaWiki releases, see the entry points in your Special:Version page or on [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org. Possibly you can want to change the files enumerated in point 9 (this list is better from a security point of view, but this requires maintenance over time).
d. The nginx configuration above was done with strict security considerations in order to remove all entry points to system files, but this requires maintenance over time. You can want to soften these security checks:
# add more PHP scripts in point 6, see [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org
# add more media files extensions in point 8, or even acess all files in the "extensions" and "skins" subdirectories, or at the contrary blacklist some file extensions (e.g. mainly .php files)
# remove the list of files in point 9, this is probably harmless from a security point of view
e. The list in point 10 could be changed depending of specific needs. For example, you could change the location of the favicon (see [https://www.mediawiki.org/wiki/Manual:$wgFavicon $wgFavicon]), or you can add a file /sitemap.xml, etc. Additionally some MediaWiki extensions or core features propose to manage some "metadata system files" like /robots.txt or /sitemap.xml; if you want to use these features, you could have to create other "location" in nginx configuration with some wrapper to PHP file, similarly to the wrapper for "/images/" in the case of a private wiki.
== Conclusion ==
# Now the URLs are "/Main_Page", "/Main_Page?action=history", "/Main_Page?printable=yes", etc.
# Non-latin alphabets benefit of the "real characters" rendering of the browser in the URL
# The system is backward-compatible with existing URLs, and old URLs are rewritten if you have installed the Lua part in the nginx configuration.
# Your articles can have a wide range of titles and are not limited by system files, e.g. you can write an article about "/Robots.txt", "/Images", "/Skins", or "Index.php" (NB: the initial capital).
# Apart whitelisted system files and subdirectories, nobody can access to the underlying system files, e.g. "/includes/Title.php" is considered as an article, as well as "/LocalSettings.php", so an attacker doesn’t have a direct access to the system files and s/he will have to deal with MediaWiki before attacking PHP files.
a8af63e3e2a5ae10dce08401e41a41b3ceef4962
23
22
2014-11-27T10:55:12Z
Seb35
1
/* Complements */
wikitext
text/x-wiki
This page is about configurating beautiful and pure URLs for MediaWiki, basically without any visible "index.php". For example:
<div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;">
:{{SERVER}}/Learning:Beautiful_MediaWiki_URLs?action=edit
''instead of''
:{{SERVER}}/index.php?title=Learning:Beautiful_MediaWiki_URLs&action=edit
</div>
and it is even better in languages with non-latin alphabets:
<div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;">
:{{SERVER}}/维基百科?action=history
''instead of''
:{{SERVER}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history
</div>
== Rationale and introduction ==
The reasoning behind this is: The syntax "index.php" is not interesting from the user’s point of view so it shouldn’t be there; additionally the user should (want) to see understandable page names instead of %-encoded nonsense.
You can see on this wiki these rules in action. Technically, these ugly URLs come from good’ ol’ time’ of [[:enwikipedia:Common Gateway Interface|CGI scripts]] (ten years ago), but now —and since some time— it is possible to rewrite URLs on the server, added to the fact that all recent browsers display URLs with characters instead of %-encoded URLs, but still not in the parameters of the URL after the "?". So it’s time to remove this "index.php".
To reconciliate MediaWiki URLs with recent browsers, we take advantage of the "path info" capability offered by servers (here nginx) and we configure MediaWiki such that it vastly limit the rendering of ugly URLs.
== Prerequisites ==
* [https://www.mediawiki.org MediaWiki], installed in the directory, say, '/var/www/mediawiki'
* [http://nginx.com nginx], preferably with the module Lua (package nginx-extras in Debian/Ubuntu)
* The wiki is assumed to be installed on "<nowiki>http://wiki.example.org/</nowiki>"
* The server must support the PATH_INFO directive; it is the case for most "nginx + PHP gateway" but you should really check it works before continuing, see [https://www.mediawiki.org/Special:MyLanguage/Manual:$wgUsePathInfo Manual:$wgUsePathInfo] on MediaWiki.org.
== MediaWiki configuration ==
It is assumed the wiki is directly served from the server root location instead of a subdirectory (e.g. <nowiki>"https://example.org/" instead of "https://example.org/tools/mywiki/"</nowiki>). In other words, the "root" directive in the nginx server is the directory itself where is installed MediaWiki (where index.php is).
The following configuration variables must be added at the end of the file LocalSettings.php, in MediaWiki directory.
1. Remove the "script path" to remove all web-visible subdirectories. This should be done accordingly with nginx configuration, or it could break the installed website.
$wgScriptPath = <nowiki>''</nowiki>;
2. Set the article path to its simplest form. With this, links leading to the 'view' action of the pages will be beautiful, instead of using "index.php". The server should support the "path info" capability —it’s the case of nginx.
$wgArticlePath = '/$1';
3. Now, true improvements begin. When you view an article, the URL is beautiful, but it becomes again ugly when you edit an article or ask its printable form. So let’s remove the "index.php".
$wgScript = <nowiki>''</nowiki>;
4. The links for the actions now have the form "/Main_Page?title=Main_Page&action=edit" for the edit action. There is still the "title=" parameter which should be removed since it is already displayed in the main part of the URL. To achieve that, we have to add a small hook in LocalSettings.php to remove the "title=" parameter.
$wgHooks['GetLocalURL::Internal'][] = 'phpAgnosticURL';
function phpAgnosticURL( $title, &$url, $query ) {
global $wgArticlePath;
$url = str_replace( '$1', wfUrlencode( $title->getPrefixedDBkey() ), $wgArticlePath );
while ( preg_match( '/^(.*&|)title=([^&]*)(&.*|)$/', $query, $matches ) ) {
$query = $matches[1] . $matches[3];
}
if ( $query != <nowiki>''</nowiki> ) {
$url = wfAppendQuery( $url, $query );
}
}
Basically, MediaWiki now generates beautiful URLs but nginx no more understand the URLs where there is no "title=" parameter. In the next part, we will retablish the functioning, we will completely hide the PHP system files (this improves security), and by the way permit the creation of page with almost all possible titles (e.g. you will be able to create the page "Index.php" on the wiki; it is probably useless^^, but perhaps you can be interested by titles "Skins/…").
== Nginx configuration ==
5. The basic skeleton is just below. 'location' directives will be added in the following.
server {
listen 80;
listen 443 ssl;
server_name wiki.example.org;
root /var/www/mediawiki;
# 'location' directives to be added thereafter
}
6. First, let’s add simple things: backend PHP scripts. We don’t search to hide them, they are backend so not viewed by human users, but machines must have access to these scripts.
location ~ ^/(api|load|opensearch_desc)\.php$ {
include php5-fpm.conf;
}
7. Next, the more important thing: the call to the hidden "index.php" to catch all actions and transmit them to MediaWiki. This use the PATH_INFO parameter of CGI scripts. Additionally, we add an exception for the situation where there is still a parameter "title="; it’s the case in MediaWiki forms (Special:Recentchanges, Special:Log, etc.) and it will make the whole system both backward-compatible and with beautiful URLs (a permanent redirect from the old URLs to the new URLs). The Lua rewriting part was done thanks to a [http://forum.nginx.org/read.php?2,243462,243464 agentzh’s message] (thanks!).
location / {
if ($arg_title != <nowiki>''</nowiki>) {
set_by_lua $mwredirect '
local args = ngx.var.args
local arg_title = ngx.var.arg_title
arg_title = ngx.re.gsub(arg_title, "%3A", ":")
arg_title = ngx.re.gsub(arg_title, "%20", "_")
arg_title = ngx.re.gsub(arg_title, "[+]", "_")
local url = "/" .. arg_title
newargs, n, err = ngx.re.gsub(args, [[\btitle=[^&]*&?]], "", "jo")
if string.len(newargs) > 0 then
url = url .. "?" ..newargs
end
if string.sub(url, -1) == "&" then
url = string.sub(url, 1, -2)
end
return url
';
return 301 $mwredirect;
}
include php5-fpm.conf;
fastcgi_split_path_info ^(/)(.*)$;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
8. Now, you should have a quite functional wiki, apart some missing images. Let’s add the UI images from the /skins subdirectory and the /extensions subdirectory at the same time (some extensions have JavaScript files or image files in their directories). Here are only allowed: the images, the JS files, the CSS and LESS files, and the .htc files (used by IE).
location ~ ^/(extensions|skins)/ {
location ~ \.(js|css|htc|less|png|svg|gif|jpg|xcf)$ {
allow all;
try_files $uri =403;
}
deny all;
}
9. Now we can allow integrated files of the /images subdirectory. Below are two variants depending if your wiki is public or private.
location ~ ^/images/ {
# Publicly accessible files
location ~ ^/images/(\.htaccess|README|lockdir.*)$ {
return 404;
}
location ~ /$ {
deny all;
}
try_files $uri =404;
# Private files for a private wiki
#include php5-fpm.conf;
#fastcgi_split_path_info ^(/images/)(.*)$;
#fastcgi_param SCRIPT_FILENAME $document_root/img_auth.php;
#fastcgi_param PATH_INFO $fastcgi_path_info;
}
10. To finish, we can add /robots.txt and /favicon.ico if they are not managed by MediaWiki extensions.
location ~ ^/(robots.txt|favicon.ico)$ {
try_files $uri =404;
}
== Complements ==
a. If you cannot install the Lua module in nginx, directly-entered old URLs (coming from external places like emails, other websites, user bookmarks, etc.) will work but will be displayed as old URLs ("/index.php?title=Main_Page&action=edit"). Once the user click on some link on the wiki, s/he will see new URLs.
b. To avoid MediaWiki to create URLs with remaining "title=" parameters, MediaWiki core should be patched in many places: in all forms where there is a "<nowiki><input type="hidden" name="title" … /></nowiki>" HTML tag and possibly in other places. Possibly some bug should be created, at least to give an option to natively create beautiful URLs.
c. MediaWiki update maintenance: nothing from the MediaWiki configuration side, apart if you modify MediaWiki core (it is not recommanded to facilitate updates). Probably the changed configuration parameters will stay backward-compatible for some long time since most were introduced in pre 1.1.0 MediaWiki versions. Possibly some PHP scripts must be added in the point 6 in future MediaWiki releases, see the entry points in your Special:Version page or on [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org. Possibly you can want to change the files enumerated in point 9 (this list is better from a security point of view, but this requires maintenance over time).
d. The nginx configuration above was done with strict security considerations in order to remove all entry points to system files, but this requires maintenance over time. You can want to soften these security checks:
# add more PHP scripts in point 6, see [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org
# add more media files extensions in point 8, or even acess all files in the "extensions" and "skins" subdirectories, or at the contrary blacklist some file extensions (e.g. mainly .php files)
# remove the list of files in point 9, this is probably harmless from a security point of view
e. The list in point 10 could be changed depending of specific needs. For example, you could change the location of the favicon (see [https://www.mediawiki.org/wiki/Manual:$wgFavicon $wgFavicon]), or you can add a file /sitemap.xml, etc. Additionally some MediaWiki extensions or core features propose to manage some "metadata system files" like /robots.txt or /sitemap.xml; if you want to use these features, you could have to create other "location" in nginx configuration with some wrapper to PHP file, similarly to the wrapper for "/images/" in the case of a private wiki.
f. As of MediaWiki 1.23, the entry points on the page Special:Version will show "[ ]" for "index.php", this can be considered a ''bug'': the case where "index.php" is completely removed is not expected :)
== Conclusion ==
# Now the URLs are "/Main_Page", "/Main_Page?action=history", "/Main_Page?printable=yes", etc.
# Non-latin alphabets benefit of the "real characters" rendering of the browser in the URL
# The system is backward-compatible with existing URLs, and old URLs are rewritten if you have installed the Lua part in the nginx configuration.
# Your articles can have a wide range of titles and are not limited by system files, e.g. you can write an article about "/Robots.txt", "/Images", "/Skins", or "Index.php" (NB: the initial capital).
# Apart whitelisted system files and subdirectories, nobody can access to the underlying system files, e.g. "/includes/Title.php" is considered as an article, as well as "/LocalSettings.php", so an attacker doesn’t have a direct access to the system files and s/he will have to deal with MediaWiki before attacking PHP files.
75860e2fbc2cc9af4ba2f0d784ebf34e43509acb
24
23
2014-11-27T10:56:10Z
Seb35
1
spaces between paragraphs
wikitext
text/x-wiki
This page is about configurating beautiful and pure URLs for MediaWiki, basically without any visible "index.php". For example:
<div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;">
:{{SERVER}}/Learning:Beautiful_MediaWiki_URLs?action=edit
''instead of''
:{{SERVER}}/index.php?title=Learning:Beautiful_MediaWiki_URLs&action=edit
</div>
and it is even better in languages with non-latin alphabets:
<div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;">
:{{SERVER}}/维基百科?action=history
''instead of''
:{{SERVER}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history
</div>
== Rationale and introduction ==
The reasoning behind this is: The syntax "index.php" is not interesting from the user’s point of view so it shouldn’t be there; additionally the user should (want) to see understandable page names instead of %-encoded nonsense.
You can see on this wiki these rules in action. Technically, these ugly URLs come from good’ ol’ time’ of [[:enwikipedia:Common Gateway Interface|CGI scripts]] (ten years ago), but now —and since some time— it is possible to rewrite URLs on the server, added to the fact that all recent browsers display URLs with characters instead of %-encoded URLs, but still not in the parameters of the URL after the "?". So it’s time to remove this "index.php".
To reconciliate MediaWiki URLs with recent browsers, we take advantage of the "path info" capability offered by servers (here nginx) and we configure MediaWiki such that it vastly limit the rendering of ugly URLs.
== Prerequisites ==
* [https://www.mediawiki.org MediaWiki], installed in the directory, say, '/var/www/mediawiki'
* [http://nginx.com nginx], preferably with the module Lua (package nginx-extras in Debian/Ubuntu)
* The wiki is assumed to be installed on "<nowiki>http://wiki.example.org/</nowiki>"
* The server must support the PATH_INFO directive; it is the case for most "nginx + PHP gateway" but you should really check it works before continuing, see [https://www.mediawiki.org/Special:MyLanguage/Manual:$wgUsePathInfo Manual:$wgUsePathInfo] on MediaWiki.org.
== MediaWiki configuration ==
It is assumed the wiki is directly served from the server root location instead of a subdirectory (e.g. <nowiki>"https://example.org/" instead of "https://example.org/tools/mywiki/"</nowiki>). In other words, the "root" directive in the nginx server is the directory itself where is installed MediaWiki (where index.php is).
The following configuration variables must be added at the end of the file LocalSettings.php, in MediaWiki directory.
1. Remove the "script path" to remove all web-visible subdirectories. This should be done accordingly with nginx configuration, or it could break the installed website.
$wgScriptPath = <nowiki>''</nowiki>;
2. Set the article path to its simplest form. With this, links leading to the 'view' action of the pages will be beautiful, instead of using "index.php". The server should support the "path info" capability —it’s the case of nginx.
$wgArticlePath = '/$1';
3. Now, true improvements begin. When you view an article, the URL is beautiful, but it becomes again ugly when you edit an article or ask its printable form. So let’s remove the "index.php".
$wgScript = <nowiki>''</nowiki>;
4. The links for the actions now have the form "/Main_Page?title=Main_Page&action=edit" for the edit action. There is still the "title=" parameter which should be removed since it is already displayed in the main part of the URL. To achieve that, we have to add a small hook in LocalSettings.php to remove the "title=" parameter.
$wgHooks['GetLocalURL::Internal'][] = 'phpAgnosticURL';
function phpAgnosticURL( $title, &$url, $query ) {
global $wgArticlePath;
$url = str_replace( '$1', wfUrlencode( $title->getPrefixedDBkey() ), $wgArticlePath );
while ( preg_match( '/^(.*&|)title=([^&]*)(&.*|)$/', $query, $matches ) ) {
$query = $matches[1] . $matches[3];
}
if ( $query != <nowiki>''</nowiki> ) {
$url = wfAppendQuery( $url, $query );
}
}
Basically, MediaWiki now generates beautiful URLs but nginx no more understand the URLs where there is no "title=" parameter. In the next part, we will retablish the functioning, we will completely hide the PHP system files (this improves security), and by the way permit the creation of page with almost all possible titles (e.g. you will be able to create the page "Index.php" on the wiki; it is probably useless^^, but perhaps you can be interested by titles "Skins/…").
== Nginx configuration ==
5. The basic skeleton is just below. 'location' directives will be added in the following.
server {
listen 80;
listen 443 ssl;
server_name wiki.example.org;
root /var/www/mediawiki;
# 'location' directives to be added thereafter
}
6. First, let’s add simple things: backend PHP scripts. We don’t search to hide them, they are backend so not viewed by human users, but machines must have access to these scripts.
location ~ ^/(api|load|opensearch_desc)\.php$ {
include php5-fpm.conf;
}
7. Next, the more important thing: the call to the hidden "index.php" to catch all actions and transmit them to MediaWiki. This use the PATH_INFO parameter of CGI scripts. Additionally, we add an exception for the situation where there is still a parameter "title="; it’s the case in MediaWiki forms (Special:Recentchanges, Special:Log, etc.) and it will make the whole system both backward-compatible and with beautiful URLs (a permanent redirect from the old URLs to the new URLs). The Lua rewriting part was done thanks to a [http://forum.nginx.org/read.php?2,243462,243464 agentzh’s message] (thanks!).
location / {
if ($arg_title != <nowiki>''</nowiki>) {
set_by_lua $mwredirect '
local args = ngx.var.args
local arg_title = ngx.var.arg_title
arg_title = ngx.re.gsub(arg_title, "%3A", ":")
arg_title = ngx.re.gsub(arg_title, "%20", "_")
arg_title = ngx.re.gsub(arg_title, "[+]", "_")
local url = "/" .. arg_title
newargs, n, err = ngx.re.gsub(args, [[\btitle=[^&]*&?]], "", "jo")
if string.len(newargs) > 0 then
url = url .. "?" ..newargs
end
if string.sub(url, -1) == "&" then
url = string.sub(url, 1, -2)
end
return url
';
return 301 $mwredirect;
}
include php5-fpm.conf;
fastcgi_split_path_info ^(/)(.*)$;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
8. Now, you should have a quite functional wiki, apart some missing images. Let’s add the UI images from the /skins subdirectory and the /extensions subdirectory at the same time (some extensions have JavaScript files or image files in their directories). Here are only allowed: the images, the JS files, the CSS and LESS files, and the .htc files (used by IE).
location ~ ^/(extensions|skins)/ {
location ~ \.(js|css|htc|less|png|svg|gif|jpg|xcf)$ {
allow all;
try_files $uri =403;
}
deny all;
}
9. Now we can allow integrated files of the /images subdirectory. Below are two variants depending if your wiki is public or private.
location ~ ^/images/ {
# Publicly accessible files
location ~ ^/images/(\.htaccess|README|lockdir.*)$ {
return 404;
}
location ~ /$ {
deny all;
}
try_files $uri =404;
# Private files for a private wiki
#include php5-fpm.conf;
#fastcgi_split_path_info ^(/images/)(.*)$;
#fastcgi_param SCRIPT_FILENAME $document_root/img_auth.php;
#fastcgi_param PATH_INFO $fastcgi_path_info;
}
10. To finish, we can add /robots.txt and /favicon.ico if they are not managed by MediaWiki extensions.
location ~ ^/(robots.txt|favicon.ico)$ {
try_files $uri =404;
}
== Complements ==
a. If you cannot install the Lua module in nginx, directly-entered old URLs (coming from external places like emails, other websites, user bookmarks, etc.) will work but will be displayed as old URLs ("/index.php?title=Main_Page&action=edit"). Once the user click on some link on the wiki, s/he will see new URLs.
b. To avoid MediaWiki to create URLs with remaining "title=" parameters, MediaWiki core should be patched in many places: in all forms where there is a "<nowiki><input type="hidden" name="title" … /></nowiki>" HTML tag and possibly in other places. Possibly some bug should be created, at least to give an option to natively create beautiful URLs.
c. MediaWiki update maintenance: nothing from the MediaWiki configuration side, apart if you modify MediaWiki core (it is not recommanded to facilitate updates). Probably the changed configuration parameters will stay backward-compatible for some long time since most were introduced in pre 1.1.0 MediaWiki versions. Possibly some PHP scripts must be added in the point 6 in future MediaWiki releases, see the entry points in your Special:Version page or on [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org. Possibly you can want to change the files enumerated in point 9 (this list is better from a security point of view, but this requires maintenance over time).
d. The nginx configuration above was done with strict security considerations in order to remove all entry points to system files, but this requires maintenance over time. You can want to soften these security checks:
# add more PHP scripts in point 6, see [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org
# add more media files extensions in point 8, or even acess all files in the "extensions" and "skins" subdirectories, or at the contrary blacklist some file extensions (e.g. mainly .php files)
# remove the list of files in point 9, this is probably harmless from a security point of view
e. The list in point 10 could be changed depending of specific needs. For example, you could change the location of the favicon (see [https://www.mediawiki.org/wiki/Manual:$wgFavicon $wgFavicon]), or you can add a file /sitemap.xml, etc. Additionally some MediaWiki extensions or core features propose to manage some "metadata system files" like /robots.txt or /sitemap.xml; if you want to use these features, you could have to create other "location" in nginx configuration with some wrapper to PHP file, similarly to the wrapper for "/images/" in the case of a private wiki.
f. As of MediaWiki 1.23, the entry points on the page Special:Version will show "[ ]" for "index.php", this can be considered a ''bug'': the case where "index.php" is completely removed is not expected :)
== Conclusion ==
# Now the URLs are "/Main_Page", "/Main_Page?action=history", "/Main_Page?printable=yes", etc.
# Non-latin alphabets benefit of the "real characters" rendering of the browser in the URL
# The system is backward-compatible with existing URLs, and old URLs are rewritten if you have installed the Lua part in the nginx configuration.
# Your articles can have a wide range of titles and are not limited by system files, e.g. you can write an article about "/Robots.txt", "/Images", "/Skins", or "Index.php" (NB: the initial capital).
# Apart whitelisted system files and subdirectories, nobody can access to the underlying system files, e.g. "/includes/Title.php" is considered as an article, as well as "/LocalSettings.php", so an attacker doesn’t have a direct access to the system files and s/he will have to deal with MediaWiki before attacking PHP files.
14edcc7713bb4777f693cd65660ecffdca9ba75e
25
24
2014-11-27T10:57:20Z
Seb35
1
wikitext
text/x-wiki
This page is about configurating beautiful and pure URLs for MediaWiki, basically without any visible "index.php". For example:
<div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;">
:{{SERVER}}/Learning:Beautiful_MediaWiki_URLs?action=edit
''instead of''
:{{SERVER}}/index.php?title=Learning:Beautiful_MediaWiki_URLs&action=edit
</div>
and it is even better in languages with non-latin alphabets:
<div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;">
:{{SERVER}}/维基百科?action=history
''instead of''
:{{SERVER}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history
</div>
== Rationale and introduction ==
The reasoning behind this is: The syntax "index.php" is not interesting from the user’s point of view so it shouldn’t be there; additionally the user should (want) to see understandable page names instead of %-encoded nonsense.
You can see on this wiki these rules in action. Technically, these ugly URLs come from good’ ol’ time’ of [[:enwikipedia:Common Gateway Interface|CGI scripts]] (ten years ago), but now —and since some time— it is possible to rewrite URLs on the server, added to the fact that all recent browsers display URLs with characters instead of %-encoded URLs, but still not in the parameters of the URL after the "?". So it’s time to remove this "index.php".
To reconciliate MediaWiki URLs with recent browsers, we take advantage of the "path info" capability offered by servers (here nginx) and we configure MediaWiki such that it vastly limit the rendering of ugly URLs.
== Prerequisites ==
* [https://www.mediawiki.org MediaWiki], installed in the directory, say, '/var/www/mediawiki'
* [http://nginx.com nginx], preferably with the module Lua (package nginx-extras in Debian/Ubuntu)
* The wiki is assumed to be installed on "<nowiki>http://wiki.example.org/</nowiki>"
* The server must support the PATH_INFO directive; it is the case for most "nginx + PHP gateway" but you should really check it works before continuing, see [https://www.mediawiki.org/Special:MyLanguage/Manual:$wgUsePathInfo Manual:$wgUsePathInfo] on MediaWiki.org.
== MediaWiki configuration ==
It is assumed the wiki is directly served from the server root location instead of a subdirectory (e.g. <nowiki>"https://example.org/" instead of "https://example.org/tools/mywiki/"</nowiki>). In other words, the "root" directive in the nginx server is the directory itself where is installed MediaWiki (where index.php is).
The following configuration variables must be added at the end of the file LocalSettings.php, in MediaWiki directory.
1. Remove the "script path" to remove all web-visible subdirectories. This should be done accordingly with nginx configuration, or it could break the installed website.
$wgScriptPath = <nowiki>''</nowiki>;
2. Set the article path to its simplest form. With this, links leading to the 'view' action of the pages will be beautiful, instead of using "index.php". The server should support the "path info" capability —it’s the case of nginx.
$wgArticlePath = '/$1';
3. Now, true improvements begin. When you view an article, the URL is beautiful, but it becomes again ugly when you edit an article or ask its printable form. So let’s remove the "index.php".
$wgScript = <nowiki>''</nowiki>;
4. The links for the actions now have the form "/Main_Page?title=Main_Page&action=edit" for the edit action. There is still the "title=" parameter which should be removed since it is already displayed in the main part of the URL. To achieve that, we have to add a small hook in LocalSettings.php to remove the "title=" parameter.
$wgHooks['GetLocalURL::Internal'][] = 'phpAgnosticURL';
function phpAgnosticURL( $title, &$url, $query ) {
global $wgArticlePath;
$url = str_replace( '$1', wfUrlencode( $title->getPrefixedDBkey() ), $wgArticlePath );
while ( preg_match( '/^(.*&|)title=([^&]*)(&.*|)$/', $query, $matches ) ) {
$query = $matches[1] . $matches[3];
}
if ( $query != <nowiki>''</nowiki> ) {
$url = wfAppendQuery( $url, $query );
}
}
Basically, MediaWiki now generates beautiful URLs but nginx no more understand the URLs where there is no "title=" parameter. In the next part, we will retablish the functioning, we will completely hide the PHP system files (this improves security), and by the way permit the creation of page with almost all possible titles (e.g. you will be able to create the page "Index.php" on the wiki; it is probably useless^^, but perhaps you can be interested by titles "Skins/…").
== Nginx configuration ==
5. The basic skeleton is just below. 'location' directives will be added in the following.
server {
listen 80;
listen 443 ssl;
server_name wiki.example.org;
root /var/www/mediawiki;
# 'location' directives to be added thereafter
}
6. First, let’s add simple things: backend PHP scripts. We don’t search to hide them, they are backend so not viewed by human users, but machines must have access to these scripts.
location ~ ^/(api|load|opensearch_desc)\.php$ {
include php5-fpm.conf;
}
7. Next, the more important thing: the call to the hidden "index.php" to catch all actions and transmit them to MediaWiki. This use the PATH_INFO parameter of CGI scripts. Additionally, we add an exception for the situation where there is still a parameter "title="; it’s the case in MediaWiki forms (Special:Recentchanges, Special:Log, etc.) and it will make the whole system both backward-compatible and with beautiful URLs (a permanent redirect from the old URLs to the new URLs). The Lua rewriting part was done thanks to a [http://forum.nginx.org/read.php?2,243462,243464 agentzh’s message] (thanks!).
location / {
if ($arg_title != <nowiki>''</nowiki>) {
set_by_lua $mwredirect '
local args = ngx.var.args
local arg_title = ngx.var.arg_title
arg_title = ngx.re.gsub(arg_title, "%3A", ":")
arg_title = ngx.re.gsub(arg_title, "%20", "_")
arg_title = ngx.re.gsub(arg_title, "[+]", "_")
local url = "/" .. arg_title
newargs, n, err = ngx.re.gsub(args, [[\btitle=[^&]*&?]], "", "jo")
if string.len(newargs) > 0 then
url = url .. "?" ..newargs
end
if string.sub(url, -1) == "&" then
url = string.sub(url, 1, -2)
end
return url
';
return 301 $mwredirect;
}
include php5-fpm.conf;
fastcgi_split_path_info ^(/)(.*)$;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
8. Now, you should have a quite functional wiki, apart some missing images. Let’s add the UI images from the /skins subdirectory and the /extensions subdirectory at the same time (some extensions have JavaScript files or image files in their directories). Here are only allowed: the images, the JS files, the CSS and LESS files, and the .htc files (used by IE).
location ~ ^/(extensions|skins)/ {
location ~ \.(js|css|htc|less|png|svg|gif|jpg|xcf)$ {
allow all;
try_files $uri =403;
}
deny all;
}
9. Now we can allow integrated files of the /images subdirectory. Below are two variants depending if your wiki is public or private.
location ~ ^/images/ {
# Publicly accessible files
location ~ ^/images/(\.htaccess|README|lockdir.*)$ {
return 404;
}
location ~ /$ {
deny all;
}
try_files $uri =404;
# Private files for a private wiki
#include php5-fpm.conf;
#fastcgi_split_path_info ^(/images/)(.*)$;
#fastcgi_param SCRIPT_FILENAME $document_root/img_auth.php;
#fastcgi_param PATH_INFO $fastcgi_path_info;
}
10. To finish, we can add /robots.txt and /favicon.ico if they are not managed by MediaWiki extensions.
location ~ ^/(robots.txt|favicon.ico)$ {
try_files $uri =404;
}
== Complements ==
a. If you cannot install the Lua module in nginx, directly-entered old URLs (coming from external places like emails, other websites, user bookmarks, etc.) will work but will be displayed as old URLs ("/index.php?title=Main_Page&action=edit"). Once the user click on some link on the wiki, s/he will see new URLs.
b. To avoid MediaWiki to create URLs with remaining "title=" parameters, MediaWiki core should be patched in many places: in all forms where there is a <nowiki><input type="hidden" name="title" … /></nowiki> HTML tag and possibly in other places. Possibly some bug should be created, at least to give an option to natively create beautiful URLs.
c. MediaWiki update maintenance: nothing from the MediaWiki configuration side, apart if you modify MediaWiki core (it is not recommanded to facilitate updates). Probably the changed configuration parameters will stay backward-compatible for some long time since most were introduced in pre 1.1.0 MediaWiki versions. Possibly some PHP scripts must be added in the point 6 in future MediaWiki releases, see the entry points in your Special:Version page or on [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org. Possibly you can want to change the files enumerated in point 9 (this list is better from a security point of view, but this requires maintenance over time).
d. The nginx configuration above was done with strict security considerations in order to remove all entry points to system files, but this requires maintenance over time. You can want to soften these security checks:
# add more PHP scripts in point 6, see [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org
# add more media files extensions in point 8, or even acess all files in the "extensions" and "skins" subdirectories, or at the contrary blacklist some file extensions (e.g. mainly .php files)
# remove the list of files in point 9, this is probably harmless from a security point of view
e. The list in point 10 could be changed depending of specific needs. For example, you could change the location of the favicon (see [https://www.mediawiki.org/wiki/Manual:$wgFavicon $wgFavicon]), or you can add a file /sitemap.xml, etc. Additionally some MediaWiki extensions or core features propose to manage some "metadata system files" like /robots.txt or /sitemap.xml; if you want to use these features, you could have to create other "location" in nginx configuration with some wrapper to PHP file, similarly to the wrapper for "/images/" in the case of a private wiki.
f. As of MediaWiki 1.23, the entry points on the page Special:Version will show "[ ]" for "index.php", this can be considered a ''bug'': the case where "index.php" is completely removed is not expected :)
== Conclusion ==
# Now the URLs are "/Main_Page", "/Main_Page?action=history", "/Main_Page?printable=yes", etc.
# Non-latin alphabets benefit of the "real characters" rendering of the browser in the URL
# The system is backward-compatible with existing URLs, and old URLs are rewritten if you have installed the Lua part in the nginx configuration.
# Your articles can have a wide range of titles and are not limited by system files, e.g. you can write an article about "/Robots.txt", "/Images", "/Skins", or "Index.php" (NB: the initial capital).
# Apart whitelisted system files and subdirectories, nobody can access to the underlying system files: e.g. "/includes/Title.php" is considered as an article, as well as "/LocalSettings.php", so an attacker doesn’t have a direct access to the system files and s/he will have to deal with MediaWiki before attacking PHP files.
50347de31c1bf24fdc310f721aa3c14c62bccd41
26
25
2014-11-27T11:10:27Z
Seb35
1
typo
wikitext
text/x-wiki
This page is about configurating beautiful and pure URLs for MediaWiki, basically without any visible "index.php". For example:
<div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;">
:{{SERVER}}/Learning:Beautiful_MediaWiki_URLs?action=edit
''instead of''
:{{SERVER}}/index.php?title=Learning:Beautiful_MediaWiki_URLs&action=edit
</div>
and it is even better in languages with non-latin alphabets:
<div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;">
:{{SERVER}}/维基百科?action=history
''instead of''
:{{SERVER}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history
</div>
== Rationale and introduction ==
The reasoning behind this is: The syntax "index.php" is not interesting from the user’s point of view so it shouldn’t be there; additionally the user should (want) to see understandable page names instead of %-encoded nonsense.
You can see on this wiki these rules in action. Technically, these ugly URLs come from good’ ol’ time’ of [[:enwikipedia:Common Gateway Interface|CGI scripts]] (ten years ago), but now —and since some time— it is possible to rewrite URLs on the server, added to the fact that all recent browsers display URLs with characters instead of %-encoded URLs, but still not in the parameters of the URL after the "?". So it’s time to remove this "index.php".
To reconciliate MediaWiki URLs with recent browsers, we take advantage of the "path info" capability offered by servers (here nginx) and we configure MediaWiki such that it vastly limit the rendering of ugly URLs.
== Prerequisites ==
* [https://www.mediawiki.org MediaWiki], installed in the directory, say, '/var/www/mediawiki'
* [http://nginx.com nginx], preferably with the module Lua (package nginx-extras in Debian/Ubuntu)
* The wiki is assumed to be installed on "<nowiki>http://wiki.example.org/</nowiki>"
* The server must support the PATH_INFO directive; it is the case for most "nginx + PHP gateway" but you should really check it works before continuing, see [https://www.mediawiki.org/Special:MyLanguage/Manual:$wgUsePathInfo Manual:$wgUsePathInfo] on MediaWiki.org.
== MediaWiki configuration ==
It is assumed the wiki is directly served from the server root location instead of a subdirectory (e.g. <nowiki>"https://example.org/" instead of "https://example.org/tools/mywiki/"</nowiki>). In other words, the "root" directive in the nginx server is the directory itself where is installed MediaWiki (where index.php is).
The following configuration variables must be added at the end of the file LocalSettings.php, in MediaWiki directory.
1. Remove the "script path" to remove all web-visible subdirectories. This should be done accordingly with nginx configuration, or it could break the installed website.
$wgScriptPath = <nowiki>''</nowiki>;
2. Set the article path to its simplest form. With this, links leading to the 'view' action of the pages will be beautiful, instead of using "index.php". The server should support the "path info" capability —it’s the case of nginx.
$wgArticlePath = '/$1';
3. Now, true improvements begin. When you view an article, the URL is beautiful, but it becomes again ugly when you edit an article or ask its printable form. So let’s remove the "index.php".
$wgScript = <nowiki>''</nowiki>;
4. The links for the actions now have the form "/Main_Page?title=Main_Page&action=edit" for the edit action. There is still the "title=" parameter which should be removed since it is already displayed in the main part of the URL. To achieve that, we have to add a small hook in LocalSettings.php to remove the "title=" parameter.
$wgHooks['GetLocalURL::Internal'][] = 'phpAgnosticURL';
function phpAgnosticURL( $title, &$url, $query ) {
global $wgArticlePath;
$url = str_replace( '$1', wfUrlencode( $title->getPrefixedDBkey() ), $wgArticlePath );
while ( preg_match( '/^(.*&|)title=([^&]*)(&.*|)$/', $query, $matches ) ) {
$query = $matches[1] . $matches[3];
}
if ( $query != <nowiki>''</nowiki> ) {
$url = wfAppendQuery( $url, $query );
}
}
Basically, MediaWiki now generates beautiful URLs but nginx no more understand the URLs where there is no "title=" parameter. In the next part, we will retablish the functioning, we will completely hide the PHP system files (this improves security), and by the way permit the creation of page with almost all possible titles (e.g. you will be able to create the page "Index.php" on the wiki; it is probably useless^^, but perhaps you can be interested by titles "Skins/…").
== Nginx configuration ==
5. The basic skeleton is just below. 'location' directives will be added in the following.
server {
listen 80;
listen 443 ssl;
server_name wiki.example.org;
root /var/www/mediawiki;
# 'location' directives to be added thereafter
}
6. First, let’s add simple things: backend PHP scripts. We don’t search to hide them, they are backend so not viewed by human users, but machines must have access to these scripts.
location ~ ^/(api|load|opensearch_desc)\.php$ {
include php5-fpm.conf;
}
7. Next, the more important thing: the call to the hidden "index.php" to catch all actions and transmit them to MediaWiki. This use the PATH_INFO parameter of CGI scripts. Additionally, we add an exception for the situation where there is still a parameter "title="; it’s the case in MediaWiki forms (Special:Recentchanges, Special:Log, etc.) and it will make the whole system both backward-compatible and with beautiful URLs (a permanent redirect from the old URLs to the new URLs). The Lua rewriting part was done thanks to an [http://forum.nginx.org/read.php?2,243462,243464 agentzh’s message] (thanks!).
location / {
if ($arg_title != <nowiki>''</nowiki>) {
set_by_lua $mwredirect '
local args = ngx.var.args
local arg_title = ngx.var.arg_title
arg_title = ngx.re.gsub(arg_title, "%3A", ":")
arg_title = ngx.re.gsub(arg_title, "%20", "_")
arg_title = ngx.re.gsub(arg_title, "[+]", "_")
local url = "/" .. arg_title
newargs, n, err = ngx.re.gsub(args, [[\btitle=[^&]*&?]], "", "jo")
if string.len(newargs) > 0 then
url = url .. "?" ..newargs
end
if string.sub(url, -1) == "&" then
url = string.sub(url, 1, -2)
end
return url
';
return 301 $mwredirect;
}
include php5-fpm.conf;
fastcgi_split_path_info ^(/)(.*)$;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
8. Now, you should have a quite functional wiki, apart some missing images. Let’s add the UI images from the /skins subdirectory and the /extensions subdirectory at the same time (some extensions have JavaScript files or image files in their directories). Here are only allowed: the images, the JS files, the CSS and LESS files, and the .htc files (used by IE).
location ~ ^/(extensions|skins)/ {
location ~ \.(js|css|htc|less|png|svg|gif|jpg|xcf)$ {
allow all;
try_files $uri =403;
}
deny all;
}
9. Now we can allow integrated files of the /images subdirectory. Below are two variants depending if your wiki is public or private.
location ~ ^/images/ {
# Publicly accessible files
location ~ ^/images/(\.htaccess|README|lockdir.*)$ {
return 404;
}
location ~ /$ {
deny all;
}
try_files $uri =404;
# Private files for a private wiki
#include php5-fpm.conf;
#fastcgi_split_path_info ^(/images/)(.*)$;
#fastcgi_param SCRIPT_FILENAME $document_root/img_auth.php;
#fastcgi_param PATH_INFO $fastcgi_path_info;
}
10. To finish, we can add /robots.txt and /favicon.ico.
location ~ ^/(robots.txt|favicon.ico)$ {
try_files $uri =404;
}
== Complements ==
a. If you cannot install the Lua module in nginx, directly-entered old URLs (coming from external places like emails, other websites, user bookmarks, etc.) will work but will be displayed as old URLs ("/index.php?title=Main_Page&action=edit"). Once the user click on some link on the wiki, s/he will see new URLs.
b. To avoid MediaWiki to create URLs with remaining "title=" parameters, MediaWiki core should be patched in many places: in all forms where there is a <nowiki><input type="hidden" name="title" … /></nowiki> HTML tag and possibly in other places. Possibly some bug should be created, at least to give an option to natively create beautiful URLs.
c. MediaWiki update maintenance: nothing from the MediaWiki configuration side, apart if you modify MediaWiki core (it is not recommanded to facilitate updates). Probably the changed configuration parameters will stay backward-compatible for some long time since most were introduced in pre 1.1.0 MediaWiki versions. Possibly some PHP scripts must be added in the point 6 in future MediaWiki releases, see the entry points in your Special:Version page or on [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org. Possibly you can want to change the files enumerated in point 9 (this list is better from a security point of view, but this requires maintenance over time).
d. The nginx configuration above was done with strict security considerations in order to remove all entry points to system files, but this requires maintenance over time. You can want to soften these security checks:
# add more PHP scripts in point 6, see [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org
# add more media files extensions in point 8, or even acess all files in the "extensions" and "skins" subdirectories, or at the contrary blacklist some file extensions (e.g. mainly .php files)
# remove the list of files in point 9, this is probably harmless from a security point of view
e. The list in point 10 could be changed depending of specific needs. For example, you could change the location of the favicon (see [https://www.mediawiki.org/wiki/Manual:$wgFavicon $wgFavicon]), or you can add a file /sitemap.xml, etc. Additionally some MediaWiki extensions or core features propose to manage some "metadata system files" like /robots.txt or /sitemap.xml; if you want to use these features, you could have to create other "location" in nginx configuration with some wrapper to PHP file, similarly to the wrapper for "/images/" in the case of a private wiki.
f. As of MediaWiki 1.23, the entry points on the page Special:Version will show "[ ]" for "index.php", this can be considered a ''bug'': the case where "index.php" is completely removed is not expected :)
== Conclusion ==
# Now the URLs are "/Main_Page", "/Main_Page?action=history", "/Main_Page?printable=yes", etc.
# Non-latin alphabets benefit of the "real characters" rendering of the browser in the URL
# The system is backward-compatible with existing URLs, and old URLs are rewritten if you have installed the Lua part in the nginx configuration.
# Your articles can have a wide range of titles and are not limited by system files, e.g. you can write an article about "/Robots.txt", "/Images", "/Skins", or "Index.php" (NB: the initial capital).
# Apart whitelisted system files and subdirectories, nobody can access to the underlying system files: e.g. "/includes/Title.php" is considered as an article, as well as "/LocalSettings.php", so an attacker doesn’t have a direct access to the system files and s/he will have to deal with MediaWiki before attacking PHP files.
8d46824e176de7a474c2d35a857539a8eeb7f9d3
27
26
2014-11-27T11:34:59Z
Seb35
1
/* Conclusion */
wikitext
text/x-wiki
This page is about configurating beautiful and pure URLs for MediaWiki, basically without any visible "index.php". For example:
<div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;">
:{{SERVER}}/Learning:Beautiful_MediaWiki_URLs?action=edit
''instead of''
:{{SERVER}}/index.php?title=Learning:Beautiful_MediaWiki_URLs&action=edit
</div>
and it is even better in languages with non-latin alphabets:
<div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;">
:{{SERVER}}/维基百科?action=history
''instead of''
:{{SERVER}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history
</div>
== Rationale and introduction ==
The reasoning behind this is: The syntax "index.php" is not interesting from the user’s point of view so it shouldn’t be there; additionally the user should (want) to see understandable page names instead of %-encoded nonsense.
You can see on this wiki these rules in action. Technically, these ugly URLs come from good’ ol’ time’ of [[:enwikipedia:Common Gateway Interface|CGI scripts]] (ten years ago), but now —and since some time— it is possible to rewrite URLs on the server, added to the fact that all recent browsers display URLs with characters instead of %-encoded URLs, but still not in the parameters of the URL after the "?". So it’s time to remove this "index.php".
To reconciliate MediaWiki URLs with recent browsers, we take advantage of the "path info" capability offered by servers (here nginx) and we configure MediaWiki such that it vastly limit the rendering of ugly URLs.
== Prerequisites ==
* [https://www.mediawiki.org MediaWiki], installed in the directory, say, '/var/www/mediawiki'
* [http://nginx.com nginx], preferably with the module Lua (package nginx-extras in Debian/Ubuntu)
* The wiki is assumed to be installed on "<nowiki>http://wiki.example.org/</nowiki>"
* The server must support the PATH_INFO directive; it is the case for most "nginx + PHP gateway" but you should really check it works before continuing, see [https://www.mediawiki.org/Special:MyLanguage/Manual:$wgUsePathInfo Manual:$wgUsePathInfo] on MediaWiki.org.
== MediaWiki configuration ==
It is assumed the wiki is directly served from the server root location instead of a subdirectory (e.g. <nowiki>"https://example.org/" instead of "https://example.org/tools/mywiki/"</nowiki>). In other words, the "root" directive in the nginx server is the directory itself where is installed MediaWiki (where index.php is).
The following configuration variables must be added at the end of the file LocalSettings.php, in MediaWiki directory.
1. Remove the "script path" to remove all web-visible subdirectories. This should be done accordingly with nginx configuration, or it could break the installed website.
$wgScriptPath = <nowiki>''</nowiki>;
2. Set the article path to its simplest form. With this, links leading to the 'view' action of the pages will be beautiful, instead of using "index.php". The server should support the "path info" capability —it’s the case of nginx.
$wgArticlePath = '/$1';
3. Now, true improvements begin. When you view an article, the URL is beautiful, but it becomes again ugly when you edit an article or ask its printable form. So let’s remove the "index.php".
$wgScript = <nowiki>''</nowiki>;
4. The links for the actions now have the form "/Main_Page?title=Main_Page&action=edit" for the edit action. There is still the "title=" parameter which should be removed since it is already displayed in the main part of the URL. To achieve that, we have to add a small hook in LocalSettings.php to remove the "title=" parameter.
$wgHooks['GetLocalURL::Internal'][] = 'phpAgnosticURL';
function phpAgnosticURL( $title, &$url, $query ) {
global $wgArticlePath;
$url = str_replace( '$1', wfUrlencode( $title->getPrefixedDBkey() ), $wgArticlePath );
while ( preg_match( '/^(.*&|)title=([^&]*)(&.*|)$/', $query, $matches ) ) {
$query = $matches[1] . $matches[3];
}
if ( $query != <nowiki>''</nowiki> ) {
$url = wfAppendQuery( $url, $query );
}
}
Basically, MediaWiki now generates beautiful URLs but nginx no more understand the URLs where there is no "title=" parameter. In the next part, we will retablish the functioning, we will completely hide the PHP system files (this improves security), and by the way permit the creation of page with almost all possible titles (e.g. you will be able to create the page "Index.php" on the wiki; it is probably useless^^, but perhaps you can be interested by titles "Skins/…").
== Nginx configuration ==
5. The basic skeleton is just below. 'location' directives will be added in the following.
server {
listen 80;
listen 443 ssl;
server_name wiki.example.org;
root /var/www/mediawiki;
# 'location' directives to be added thereafter
}
6. First, let’s add simple things: backend PHP scripts. We don’t search to hide them, they are backend so not viewed by human users, but machines must have access to these scripts.
location ~ ^/(api|load|opensearch_desc)\.php$ {
include php5-fpm.conf;
}
7. Next, the more important thing: the call to the hidden "index.php" to catch all actions and transmit them to MediaWiki. This use the PATH_INFO parameter of CGI scripts. Additionally, we add an exception for the situation where there is still a parameter "title="; it’s the case in MediaWiki forms (Special:Recentchanges, Special:Log, etc.) and it will make the whole system both backward-compatible and with beautiful URLs (a permanent redirect from the old URLs to the new URLs). The Lua rewriting part was done thanks to an [http://forum.nginx.org/read.php?2,243462,243464 agentzh’s message] (thanks!).
location / {
if ($arg_title != <nowiki>''</nowiki>) {
set_by_lua $mwredirect '
local args = ngx.var.args
local arg_title = ngx.var.arg_title
arg_title = ngx.re.gsub(arg_title, "%3A", ":")
arg_title = ngx.re.gsub(arg_title, "%20", "_")
arg_title = ngx.re.gsub(arg_title, "[+]", "_")
local url = "/" .. arg_title
newargs, n, err = ngx.re.gsub(args, [[\btitle=[^&]*&?]], "", "jo")
if string.len(newargs) > 0 then
url = url .. "?" ..newargs
end
if string.sub(url, -1) == "&" then
url = string.sub(url, 1, -2)
end
return url
';
return 301 $mwredirect;
}
include php5-fpm.conf;
fastcgi_split_path_info ^(/)(.*)$;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
8. Now, you should have a quite functional wiki, apart some missing images. Let’s add the UI images from the /skins subdirectory and the /extensions subdirectory at the same time (some extensions have JavaScript files or image files in their directories). Here are only allowed: the images, the JS files, the CSS and LESS files, and the .htc files (used by IE).
location ~ ^/(extensions|skins)/ {
location ~ \.(js|css|htc|less|png|svg|gif|jpg|xcf)$ {
allow all;
try_files $uri =403;
}
deny all;
}
9. Now we can allow integrated files of the /images subdirectory. Below are two variants depending if your wiki is public or private.
location ~ ^/images/ {
# Publicly accessible files
location ~ ^/images/(\.htaccess|README|lockdir.*)$ {
return 404;
}
location ~ /$ {
deny all;
}
try_files $uri =404;
# Private files for a private wiki
#include php5-fpm.conf;
#fastcgi_split_path_info ^(/images/)(.*)$;
#fastcgi_param SCRIPT_FILENAME $document_root/img_auth.php;
#fastcgi_param PATH_INFO $fastcgi_path_info;
}
10. To finish, we can add /robots.txt and /favicon.ico.
location ~ ^/(robots.txt|favicon.ico)$ {
try_files $uri =404;
}
== Complements ==
a. If you cannot install the Lua module in nginx, directly-entered old URLs (coming from external places like emails, other websites, user bookmarks, etc.) will work but will be displayed as old URLs ("/index.php?title=Main_Page&action=edit"). Once the user click on some link on the wiki, s/he will see new URLs.
b. To avoid MediaWiki to create URLs with remaining "title=" parameters, MediaWiki core should be patched in many places: in all forms where there is a <nowiki><input type="hidden" name="title" … /></nowiki> HTML tag and possibly in other places. Possibly some bug should be created, at least to give an option to natively create beautiful URLs.
c. MediaWiki update maintenance: nothing from the MediaWiki configuration side, apart if you modify MediaWiki core (it is not recommanded to facilitate updates). Probably the changed configuration parameters will stay backward-compatible for some long time since most were introduced in pre 1.1.0 MediaWiki versions. Possibly some PHP scripts must be added in the point 6 in future MediaWiki releases, see the entry points in your Special:Version page or on [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org. Possibly you can want to change the files enumerated in point 9 (this list is better from a security point of view, but this requires maintenance over time).
d. The nginx configuration above was done with strict security considerations in order to remove all entry points to system files, but this requires maintenance over time. You can want to soften these security checks:
# add more PHP scripts in point 6, see [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org
# add more media files extensions in point 8, or even acess all files in the "extensions" and "skins" subdirectories, or at the contrary blacklist some file extensions (e.g. mainly .php files)
# remove the list of files in point 9, this is probably harmless from a security point of view
e. The list in point 10 could be changed depending of specific needs. For example, you could change the location of the favicon (see [https://www.mediawiki.org/wiki/Manual:$wgFavicon $wgFavicon]), or you can add a file /sitemap.xml, etc. Additionally some MediaWiki extensions or core features propose to manage some "metadata system files" like /robots.txt or /sitemap.xml; if you want to use these features, you could have to create other "location" in nginx configuration with some wrapper to PHP file, similarly to the wrapper for "/images/" in the case of a private wiki.
f. As of MediaWiki 1.23, the entry points on the page Special:Version will show "[ ]" for "index.php", this can be considered a ''bug'': the case where "index.php" is completely removed is not expected :)
== Conclusion ==
# Now the URLs are "/Main_Page", "/Main_Page?action=history", "/Main_Page?printable=yes", etc.
# Non-latin alphabets benefit of the "real characters" rendering of the browser in the URL
# The system is backward-compatible with existing URLs, and old URLs are rewritten if you have installed the Lua part in the nginx configuration.
# Your articles can have a wide range of titles and are not limited by system files, e.g. you can write articles about "Robots.txt", "Images", "Skins", or "Index.php" (NB: the initial capital).
# Except whitelisted system files and subdirectories, nobody can access to the underlying system files: e.g. "includes/Title.php" is considered as an article, as well as "LocalSettings.php", hence an attacker does not have a direct access to the system files and s/he will have to deal with MediaWiki before attacking PHP files.
9850067e9de9dce5badf5078964cb00619f2f54e
Archéo Lex/Base de données
0
10
31
2014-12-12T12:09:07Z
Seb35
1
init
wikitext
text/x-wiki
Archéo Lex importe dans un base de données SQLite les données parsées des textes de loi à partir des bases XML ouvertes (LEGI, KALI, etc.). Pour l’instant, seule la base LEGI a été testée. Cette base de données SQLite permet d’avoir de pouvoir requêter facilement afin de créer les textes de loi dans les formats demandés, ainsi que de pouvoir recréer des textes déjà compilés (''reproductible data'') sous réserve d’avoir encore les textes des articles dans leur version d’alors.
La base de données contient toutes les métadonnées utiles extraites des bases XML ainsi que les intitulés des sections (généralement quelques mots). En particulier, elle ne contient pas les articles (dans cette version de la base de données SQLite) car cela prendrait beaucoup de place, pas forcément utilement.
== Structure ==
; texte
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "texte" ("cid" VARCHAR(20) NOT NULL PRIMARY KEY, "nor" VARCHAR(20) NOT NULL, "nature" VARCHAR(20) NOT NULL, "date_texte" DATE, "date_publi" DATE);
</syntaxhighlight>
; version_texte
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "version_texte" ("id" INTEGER NOT NULL PRIMARY KEY, "texte_id" VARCHAR(20) NOT NULL, "titre" VARCHAR(200) NOT NULL, "titre_long" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "debut" DATE, "fin" DATE, "base_id" INTEGER, FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("base_id") REFERENCES "version_texte" ("id"));
CREATE INDEX "version_texte_base_id" ON "version_texte" ("base_id");
CREATE INDEX "version_texte_texte_id" ON "version_texte" ("texte_id");
</syntaxhighlight>
; section
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "section" ("cid" VARCHAR(20) NOT NULL PRIMARY KEY, "cid_parent_id" VARCHAR(20), "niveau" INTEGER NOT NULL, "texte_id" VARCHAR(20) NOT NULL, FOREIGN KEY ("cid_parent_id") REFERENCES "section" ("cid"), FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"));
CREATE INDEX "section_cid_parent_id" ON "section" ("cid_parent_id");
CREATE INDEX "section_texte_id" ON "section" ("texte_id");
</syntaxhighlight>
; version_section
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "version_section" ("id" VARCHAR(20) NOT NULL PRIMARY KEY, "cid_id" VARCHAR(20) NOT NULL, "id_parent_id" VARCHAR(20), "nom" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "niveau" INTEGER NOT NULL, "numero" INTEGER NOT NULL, "debut" DATE NOT NULL, "fin" DATE, "texte_id" VARCHAR(20) NOT NULL, "version_texte_id" INTEGER, FOREIGN KEY ("cid_id") REFERENCES "section" ("cid"), FOREIGN KEY ("id_parent_id") REFERENCES "version_section" ("id"), FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id"));
CREATE INDEX "version_section_cid_id" ON "version_section" ("cid_id");
CREATE INDEX "version_section_id_parent_id" ON "version_section" ("id_parent_id");
CREATE INDEX "version_section_texte_id" ON "version_section" ("texte_id");
CREATE INDEX "version_section_version_texte_id" ON "version_section" ("version_texte_id");
</syntaxhighlight>
; article
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "article" ("id" VARCHAR(20) NOT NULL PRIMARY KEY, "nom" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "num" VARCHAR(200) NOT NULL, "debut" DATE NOT NULL, "fin" DATE, "texte_id" VARCHAR(20) NOT NULL, "version_section_id" VARCHAR(20) NOT NULL, "version_texte_id" INTEGER NOT NULL, FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("version_section_id") REFERENCES "version_section" ("id"), FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id"));
CREATE INDEX "article_texte_id" ON "article" ("texte_id");
CREATE INDEX "article_version_section_id" ON "article" ("version_section_id");
CREATE INDEX "article_version_texte_id" ON "article" ("version_texte_id");
</syntaxhighlight>
bdbefbb3c25e9d807d676a307c55943dde181641
35
31
2014-12-12T12:37:23Z
Seb35
1
/* Structure */ typo
wikitext
text/x-wiki
Archéo Lex importe dans un base de données SQLite les données parsées des textes de loi à partir des bases XML ouvertes (LEGI, KALI, etc.). Pour l’instant, seule la base LEGI a été testée. Cette base de données SQLite permet d’avoir de pouvoir requêter facilement afin de créer les textes de loi dans les formats demandés, ainsi que de pouvoir recréer des textes déjà compilés (''reproductible data'') sous réserve d’avoir encore les textes des articles dans leur version d’alors.
La base de données contient toutes les métadonnées utiles extraites des bases XML ainsi que les intitulés des sections (généralement quelques mots). En particulier, elle ne contient pas les articles (dans cette version de la base de données SQLite) car cela prendrait beaucoup de place, pas forcément utilement.
== Structure ==
; texte
<syntaxhighlight lang="sql" enclose="div" style="padding-left:2em; text-indent:-1em;">
CREATE TABLE "texte" ("cid" VARCHAR(20) NOT NULL PRIMARY KEY, "nor" VARCHAR(20) NOT NULL, "nature" VARCHAR(20) NOT NULL, "date_texte" DATE, "date_publi" DATE);
</syntaxhighlight>
; version_texte
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "version_texte" ("id" INTEGER NOT NULL PRIMARY KEY, "texte_id" VARCHAR(20) NOT NULL, "titre" VARCHAR(200) NOT NULL, "titre_long" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "debut" DATE, "fin" DATE, "base_id" INTEGER, FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("base_id") REFERENCES "version_texte" ("id"));
CREATE INDEX "version_texte_base_id" ON "version_texte" ("base_id");
CREATE INDEX "version_texte_texte_id" ON "version_texte" ("texte_id");
</syntaxhighlight>
; section
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "section" ("cid" VARCHAR(20) NOT NULL PRIMARY KEY, "cid_parent_id" VARCHAR(20), "niveau" INTEGER NOT NULL, "texte_id" VARCHAR(20) NOT NULL, FOREIGN KEY ("cid_parent_id") REFERENCES "section" ("cid"), FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"));
CREATE INDEX "section_cid_parent_id" ON "section" ("cid_parent_id");
CREATE INDEX "section_texte_id" ON "section" ("texte_id");
</syntaxhighlight>
; version_section
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "version_section" ("id" VARCHAR(20) NOT NULL PRIMARY KEY, "cid_id" VARCHAR(20) NOT NULL, "id_parent_id" VARCHAR(20), "nom" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "niveau" INTEGER NOT NULL, "numero" INTEGER NOT NULL, "debut" DATE NOT NULL, "fin" DATE, "texte_id" VARCHAR(20) NOT NULL, "version_texte_id" INTEGER, FOREIGN KEY ("cid_id") REFERENCES "section" ("cid"), FOREIGN KEY ("id_parent_id") REFERENCES "version_section" ("id"), FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id"));
CREATE INDEX "version_section_cid_id" ON "version_section" ("cid_id");
CREATE INDEX "version_section_id_parent_id" ON "version_section" ("id_parent_id");
CREATE INDEX "version_section_texte_id" ON "version_section" ("texte_id");
CREATE INDEX "version_section_version_texte_id" ON "version_section" ("version_texte_id");
</syntaxhighlight>
; article
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "article" ("id" VARCHAR(20) NOT NULL PRIMARY KEY, "nom" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "num" VARCHAR(200) NOT NULL, "debut" DATE NOT NULL, "fin" DATE, "texte_id" VARCHAR(20) NOT NULL, "version_section_id" VARCHAR(20) NOT NULL, "version_texte_id" INTEGER NOT NULL, FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("version_section_id") REFERENCES "version_section" ("id"), FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id"));
CREATE INDEX "article_texte_id" ON "article" ("texte_id");
CREATE INDEX "article_version_section_id" ON "article" ("version_section_id");
CREATE INDEX "article_version_texte_id" ON "article" ("version_texte_id");
</syntaxhighlight>
91e55330af52c2edc1f0e81c074ee76f72e9afc1
36
35
2014-12-21T16:44:05Z
Seb35
1
+explication de <s>texte</s> base de données
wikitext
text/x-wiki
Archéo Lex importe les codes de la base LEGI dans un base de données SQLite. Cette base de données SQLite permet d’avoir de pouvoir requêter facilement afin de créer les textes de loi dans les formats demandés, ainsi que de pouvoir recréer des textes déjà compilés (''reproductible data''), sous réserve d’avoir encore les textes des articles dans leur version d’alors puisqu’ils ne sont pas enregistrés pour des questions de place.
== Structure ==
La base de données comprend deux types d’informations :
# la base LEGI en tant que donnée brute importée : tables <tt>texte</tt>, <tt>section</tt>, <tt>article</tt> avec diverses métadonnées ;
# les versions consolidées des codes tels que calculés par le programme, puisque cette information n’est pas donnée explicitement dans la base LEGI (il faut rassembler toutes les dates de consolidation mentionnées pour obtenir l’ensemble des versions consolidées) : tables <tt>version_texte</tt>, <tt>version_section</tt>.
De plus, pour permettre de modifier de façon incrémentale les dépôts Git en sortie au fur et à mesure de la mise à jour de la base LEGI, chaque enregistrement dans la base de données est également étiqueté avec la date de la dernière mise à jour du code dans la base LEGI <span style="color:red">[il faut ajouter ces tags dans la BDD]</span>. Ainsi, lorsqu’une section est mise à jour dans la base LEGI, un enregistrement dans <tt>version_section</tt> est créé <u>ainsi qu’un nouveau lien entre <tt>article</tt> et <tt>version_section</tt></u> <span style="color:red">[il faut ajouter une table version_section_article ou version_article]</span>. De même, lorsqu’un article est mis à jour dans la base LEGI, un enregistrement dans <tt>article</tt> <span style="color:red">[ou version_article]</span> ainsi qu’un lien <span style="color:red">[même remarque que précédemment]</span>.
== Schéma SQL ==
; texte
<syntaxhighlight lang="sql" enclose="div" style="padding-left:2em; text-indent:-1em;">
CREATE TABLE "texte" ("cid" VARCHAR(20) NOT NULL PRIMARY KEY, "nor" VARCHAR(20) NOT NULL, "nature" VARCHAR(20) NOT NULL, "date_texte" DATE, "date_publi" DATE);
</syntaxhighlight>
; version_texte
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "version_texte" ("id" INTEGER NOT NULL PRIMARY KEY, "texte_id" VARCHAR(20) NOT NULL, "titre" VARCHAR(200) NOT NULL, "titre_long" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "debut" DATE, "fin" DATE, "base_id" INTEGER, FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("base_id") REFERENCES "version_texte" ("id"));
CREATE INDEX "version_texte_base_id" ON "version_texte" ("base_id");
CREATE INDEX "version_texte_texte_id" ON "version_texte" ("texte_id");
</syntaxhighlight>
; section
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "section" ("cid" VARCHAR(20) NOT NULL PRIMARY KEY, "cid_parent_id" VARCHAR(20), "niveau" INTEGER NOT NULL, "texte_id" VARCHAR(20) NOT NULL, FOREIGN KEY ("cid_parent_id") REFERENCES "section" ("cid"), FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"));
CREATE INDEX "section_cid_parent_id" ON "section" ("cid_parent_id");
CREATE INDEX "section_texte_id" ON "section" ("texte_id");
</syntaxhighlight>
; version_section
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "version_section" ("id" VARCHAR(20) NOT NULL PRIMARY KEY, "cid_id" VARCHAR(20) NOT NULL, "id_parent_id" VARCHAR(20), "nom" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "niveau" INTEGER NOT NULL, "numero" INTEGER NOT NULL, "debut" DATE NOT NULL, "fin" DATE, "texte_id" VARCHAR(20) NOT NULL, "version_texte_id" INTEGER, FOREIGN KEY ("cid_id") REFERENCES "section" ("cid"), FOREIGN KEY ("id_parent_id") REFERENCES "version_section" ("id"), FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id"));
CREATE INDEX "version_section_cid_id" ON "version_section" ("cid_id");
CREATE INDEX "version_section_id_parent_id" ON "version_section" ("id_parent_id");
CREATE INDEX "version_section_texte_id" ON "version_section" ("texte_id");
CREATE INDEX "version_section_version_texte_id" ON "version_section" ("version_texte_id");
</syntaxhighlight>
; article
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "article" ("id" VARCHAR(20) NOT NULL PRIMARY KEY, "nom" VARCHAR(200) NOT NULL, "etat_juridique" VARCHAR(25) NOT NULL, "num" VARCHAR(200) NOT NULL, "debut" DATE NOT NULL, "fin" DATE, "texte_id" VARCHAR(20) NOT NULL, "version_section_id" VARCHAR(20) NOT NULL, "version_texte_id" INTEGER NOT NULL, FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"), FOREIGN KEY ("version_section_id") REFERENCES "version_section" ("id"), FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id"));
CREATE INDEX "article_texte_id" ON "article" ("texte_id");
CREATE INDEX "article_version_section_id" ON "article" ("version_section_id");
CREATE INDEX "article_version_texte_id" ON "article" ("version_texte_id");
</syntaxhighlight>
ed0e5ad926ab37d70172cd9f50bf01fcf922380b
38
36
2014-12-21T18:39:28Z
Seb35
1
+schéma, +schéma sql plus lisible
wikitext
text/x-wiki
Archéo Lex importe les codes de la base LEGI dans un base de données SQLite. Cette base de données SQLite permet d’avoir de pouvoir requêter facilement afin de créer les textes de loi dans les formats demandés, ainsi que de pouvoir recréer des textes déjà compilés (''reproductible data''), sous réserve d’avoir encore les textes des articles dans leur version d’alors puisqu’ils ne sont pas enregistrés pour des questions de place.
== Structure ==
La base de données comprend deux types d’informations :
# la base LEGI en tant que donnée brute importée : tables <tt>texte</tt>, <tt>section</tt>, <tt>article</tt> avec diverses métadonnées ;
# les versions consolidées des codes tels que calculés par le programme, puisque cette information n’est pas donnée explicitement dans la base LEGI (il faut rassembler toutes les dates de consolidation mentionnées pour obtenir l’ensemble des versions consolidées) : tables <tt>version_texte</tt>, <tt>version_section</tt>.
De plus, pour permettre de modifier de façon incrémentale les dépôts Git en sortie au fur et à mesure de la mise à jour de la base LEGI, chaque enregistrement dans la base de données est également étiqueté avec la date de la dernière mise à jour du code dans la base LEGI <span style="color:red">[il faut ajouter ces tags dans la BDD]</span>. Ainsi, lorsqu’une section est mise à jour dans la base LEGI, un enregistrement dans <tt>version_section</tt> est créé <u>ainsi qu’un nouveau lien entre <tt>article</tt> et <tt>version_section</tt></u> <span style="color:red">[il faut ajouter une table version_section_article ou version_article]</span>. De même, lorsqu’un article est mis à jour dans la base LEGI, un enregistrement dans <tt>article</tt> <span style="color:red">[ou version_article]</span> ainsi qu’un lien <span style="color:red">[même remarque que précédemment]</span>.
== Schéma SQL ==
[[Fichier:BDD Archéo Lex.svg|center]]
; texte
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "texte" (
"cid" VARCHAR(20) NOT NULL PRIMARY KEY,
"nor" VARCHAR(20) NOT NULL,
"nature" VARCHAR(20) NOT NULL,
"date_texte" DATE,
"date_publi" DATE
);
</syntaxhighlight>
; version_texte
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "version_texte" (
"id" INTEGER NOT NULL PRIMARY KEY,
"texte_id" VARCHAR(20) NOT NULL,
"titre" VARCHAR(200) NOT NULL,
"titre_long" VARCHAR(200) NOT NULL,
"etat_juridique" VARCHAR(25) NOT NULL,
"debut" DATE,
"fin" DATE,
"base_id" INTEGER,
FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"),
FOREIGN KEY ("base_id") REFERENCES "version_texte" ("id")
);
CREATE INDEX "version_texte_base_id" ON "version_texte" ("base_id");
CREATE INDEX "version_texte_texte_id" ON "version_texte" ("texte_id");
</syntaxhighlight>
; section
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "section" (
"cid" VARCHAR(20) NOT NULL PRIMARY KEY,
"cid_parent_id" VARCHAR(20),
"niveau" INTEGER NOT NULL,
"texte_id" VARCHAR(20) NOT NULL,
FOREIGN KEY ("cid_parent_id") REFERENCES "section" ("cid"),
FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid")
);
CREATE INDEX "section_cid_parent_id" ON "section" ("cid_parent_id");
CREATE INDEX "section_texte_id" ON "section" ("texte_id");
</syntaxhighlight>
; version_section
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "version_section" (
"id" VARCHAR(20) NOT NULL PRIMARY KEY,
"cid_id" VARCHAR(20) NOT NULL,
"id_parent_id" VARCHAR(20),
"nom" VARCHAR(200) NOT NULL,
"etat_juridique" VARCHAR(25) NOT NULL,
"niveau" INTEGER NOT NULL,
"numero" INTEGER NOT NULL,
"debut" DATE NOT NULL,
"fin" DATE, "texte_id" VARCHAR(20) NOT NULL,
"version_texte_id" INTEGER,
FOREIGN KEY ("cid_id") REFERENCES "section" ("cid"),
FOREIGN KEY ("id_parent_id") REFERENCES "version_section" ("id"),
FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"),
FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id")
);
CREATE INDEX "version_section_cid_id" ON "version_section" ("cid_id");
CREATE INDEX "version_section_id_parent_id" ON "version_section" ("id_parent_id");
CREATE INDEX "version_section_texte_id" ON "version_section" ("texte_id");
CREATE INDEX "version_section_version_texte_id" ON "version_section" ("version_texte_id");
</syntaxhighlight>
; article
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "article" (
"id" VARCHAR(20) NOT NULL PRIMARY KEY,
"nom" VARCHAR(200) NOT NULL,
"etat_juridique" VARCHAR(25) NOT NULL,
"num" VARCHAR(200) NOT NULL,
"debut" DATE NOT NULL,
"fin" DATE,
"texte_id" VARCHAR(20) NOT NULL,
"version_section_id" VARCHAR(20) NOT NULL,
"version_texte_id" INTEGER NOT NULL,
FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"),
FOREIGN KEY ("version_section_id") REFERENCES "version_section" ("id"),
FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id")
);
CREATE INDEX "article_texte_id" ON "article" ("texte_id");
CREATE INDEX "article_version_section_id" ON "article" ("version_section_id");
CREATE INDEX "article_version_texte_id" ON "article" ("version_texte_id");
</syntaxhighlight>
532025e5497e4f00d4e4019b56d03647fcbd4760
45
38
2014-12-22T14:04:25Z
Seb35
1
+cat
wikitext
text/x-wiki
Archéo Lex importe les codes de la base LEGI dans un base de données SQLite. Cette base de données SQLite permet d’avoir de pouvoir requêter facilement afin de créer les textes de loi dans les formats demandés, ainsi que de pouvoir recréer des textes déjà compilés (''reproductible data''), sous réserve d’avoir encore les textes des articles dans leur version d’alors puisqu’ils ne sont pas enregistrés pour des questions de place.
== Structure ==
La base de données comprend deux types d’informations :
# la base LEGI en tant que donnée brute importée : tables <tt>texte</tt>, <tt>section</tt>, <tt>article</tt> avec diverses métadonnées ;
# les versions consolidées des codes tels que calculés par le programme, puisque cette information n’est pas donnée explicitement dans la base LEGI (il faut rassembler toutes les dates de consolidation mentionnées pour obtenir l’ensemble des versions consolidées) : tables <tt>version_texte</tt>, <tt>version_section</tt>.
De plus, pour permettre de modifier de façon incrémentale les dépôts Git en sortie au fur et à mesure de la mise à jour de la base LEGI, chaque enregistrement dans la base de données est également étiqueté avec la date de la dernière mise à jour du code dans la base LEGI <span style="color:red">[il faut ajouter ces tags dans la BDD]</span>. Ainsi, lorsqu’une section est mise à jour dans la base LEGI, un enregistrement dans <tt>version_section</tt> est créé <u>ainsi qu’un nouveau lien entre <tt>article</tt> et <tt>version_section</tt></u> <span style="color:red">[il faut ajouter une table version_section_article ou version_article]</span>. De même, lorsqu’un article est mis à jour dans la base LEGI, un enregistrement dans <tt>article</tt> <span style="color:red">[ou version_article]</span> ainsi qu’un lien <span style="color:red">[même remarque que précédemment]</span>.
== Schéma SQL ==
[[Fichier:BDD Archéo Lex.svg|center]]
; texte
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "texte" (
"cid" VARCHAR(20) NOT NULL PRIMARY KEY,
"nor" VARCHAR(20) NOT NULL,
"nature" VARCHAR(20) NOT NULL,
"date_texte" DATE,
"date_publi" DATE
);
</syntaxhighlight>
; version_texte
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "version_texte" (
"id" INTEGER NOT NULL PRIMARY KEY,
"texte_id" VARCHAR(20) NOT NULL,
"titre" VARCHAR(200) NOT NULL,
"titre_long" VARCHAR(200) NOT NULL,
"etat_juridique" VARCHAR(25) NOT NULL,
"debut" DATE,
"fin" DATE,
"base_id" INTEGER,
FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"),
FOREIGN KEY ("base_id") REFERENCES "version_texte" ("id")
);
CREATE INDEX "version_texte_base_id" ON "version_texte" ("base_id");
CREATE INDEX "version_texte_texte_id" ON "version_texte" ("texte_id");
</syntaxhighlight>
; section
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "section" (
"cid" VARCHAR(20) NOT NULL PRIMARY KEY,
"cid_parent_id" VARCHAR(20),
"niveau" INTEGER NOT NULL,
"texte_id" VARCHAR(20) NOT NULL,
FOREIGN KEY ("cid_parent_id") REFERENCES "section" ("cid"),
FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid")
);
CREATE INDEX "section_cid_parent_id" ON "section" ("cid_parent_id");
CREATE INDEX "section_texte_id" ON "section" ("texte_id");
</syntaxhighlight>
; version_section
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "version_section" (
"id" VARCHAR(20) NOT NULL PRIMARY KEY,
"cid_id" VARCHAR(20) NOT NULL,
"id_parent_id" VARCHAR(20),
"nom" VARCHAR(200) NOT NULL,
"etat_juridique" VARCHAR(25) NOT NULL,
"niveau" INTEGER NOT NULL,
"numero" INTEGER NOT NULL,
"debut" DATE NOT NULL,
"fin" DATE, "texte_id" VARCHAR(20) NOT NULL,
"version_texte_id" INTEGER,
FOREIGN KEY ("cid_id") REFERENCES "section" ("cid"),
FOREIGN KEY ("id_parent_id") REFERENCES "version_section" ("id"),
FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"),
FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id")
);
CREATE INDEX "version_section_cid_id" ON "version_section" ("cid_id");
CREATE INDEX "version_section_id_parent_id" ON "version_section" ("id_parent_id");
CREATE INDEX "version_section_texte_id" ON "version_section" ("texte_id");
CREATE INDEX "version_section_version_texte_id" ON "version_section" ("version_texte_id");
</syntaxhighlight>
; article
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "article" (
"id" VARCHAR(20) NOT NULL PRIMARY KEY,
"nom" VARCHAR(200) NOT NULL,
"etat_juridique" VARCHAR(25) NOT NULL,
"num" VARCHAR(200) NOT NULL,
"debut" DATE NOT NULL,
"fin" DATE,
"texte_id" VARCHAR(20) NOT NULL,
"version_section_id" VARCHAR(20) NOT NULL,
"version_texte_id" INTEGER NOT NULL,
FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"),
FOREIGN KEY ("version_section_id") REFERENCES "version_section" ("id"),
FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id")
);
CREATE INDEX "article_texte_id" ON "article" ("texte_id");
CREATE INDEX "article_version_section_id" ON "article" ("version_section_id");
CREATE INDEX "article_version_texte_id" ON "article" ("version_texte_id");
</syntaxhighlight>
[[Catégorie:Archéo Lex]]
3bc5ec40940051334ae91d7e1bc34a9d32247d8d
49
45
2014-12-23T12:08:15Z
Seb35
1
tag 1.0
wikitext
text/x-wiki
Archéo Lex importe les codes de la base LEGI dans un base de données SQLite. Cette base de données SQLite permet d’avoir de pouvoir requêter facilement afin de créer les textes de loi dans les formats demandés, ainsi que de pouvoir recréer des textes déjà compilés (''reproductible data''), sous réserve d’avoir encore les textes des articles dans leur version d’alors puisqu’ils ne sont pas enregistrés pour des questions de place.
== Structure ==
La base de données comprend deux types d’informations :
# la base LEGI en tant que donnée brute importée : tables <tt>texte</tt>, <tt>section</tt>, <tt>article</tt> avec diverses métadonnées ;
# les versions consolidées des codes tels que calculés par le programme, puisque cette information n’est pas donnée explicitement dans la base LEGI (il faut rassembler toutes les dates de consolidation mentionnées pour obtenir l’ensemble des versions consolidées) : tables <tt>version_texte</tt>, <tt>version_section</tt>.
De plus, pour permettre de modifier de façon incrémentale les dépôts Git en sortie au fur et à mesure de la mise à jour de la base LEGI, chaque enregistrement dans la base de données est également étiqueté avec la date de la dernière mise à jour du code dans la base LEGI <span style="color:red">[il faut ajouter ces tags dans la BDD]</span>. Ainsi, lorsqu’une section est mise à jour dans la base LEGI, un enregistrement dans <tt>version_section</tt> est créé <u>ainsi qu’un nouveau lien entre <tt>article</tt> et <tt>version_section</tt></u> <span style="color:red">[il faut ajouter une table version_section_article ou version_article]</span>. De même, lorsqu’un article est mis à jour dans la base LEGI, un enregistrement dans <tt>article</tt> <span style="color:red">[ou version_article]</span> ainsi qu’un lien <span style="color:red">[même remarque que précédemment]</span>.
== Schéma SQL 1.0 ==
[[Fichier:BDD Archéo Lex 1.0.svg|center]]
; texte
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "texte" (
"cid" VARCHAR(20) NOT NULL PRIMARY KEY,
"nor" VARCHAR(20) NOT NULL,
"nature" VARCHAR(20) NOT NULL,
"date_texte" DATE,
"date_publi" DATE
);
</syntaxhighlight>
; version_texte
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "version_texte" (
"id" INTEGER NOT NULL PRIMARY KEY,
"texte_id" VARCHAR(20) NOT NULL,
"titre" VARCHAR(200) NOT NULL,
"titre_long" VARCHAR(200) NOT NULL,
"etat_juridique" VARCHAR(25) NOT NULL,
"debut" DATE,
"fin" DATE,
"base_id" INTEGER,
FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"),
FOREIGN KEY ("base_id") REFERENCES "version_texte" ("id")
);
CREATE INDEX "version_texte_base_id" ON "version_texte" ("base_id");
CREATE INDEX "version_texte_texte_id" ON "version_texte" ("texte_id");
</syntaxhighlight>
; section
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "section" (
"cid" VARCHAR(20) NOT NULL PRIMARY KEY,
"cid_parent_id" VARCHAR(20),
"niveau" INTEGER NOT NULL,
"texte_id" VARCHAR(20) NOT NULL,
FOREIGN KEY ("cid_parent_id") REFERENCES "section" ("cid"),
FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid")
);
CREATE INDEX "section_cid_parent_id" ON "section" ("cid_parent_id");
CREATE INDEX "section_texte_id" ON "section" ("texte_id");
</syntaxhighlight>
; version_section
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "version_section" (
"id" VARCHAR(20) NOT NULL PRIMARY KEY,
"cid_id" VARCHAR(20) NOT NULL,
"id_parent_id" VARCHAR(20),
"nom" VARCHAR(200) NOT NULL,
"etat_juridique" VARCHAR(25) NOT NULL,
"niveau" INTEGER NOT NULL,
"numero" INTEGER NOT NULL,
"debut" DATE NOT NULL,
"fin" DATE, "texte_id" VARCHAR(20) NOT NULL,
"version_texte_id" INTEGER,
FOREIGN KEY ("cid_id") REFERENCES "section" ("cid"),
FOREIGN KEY ("id_parent_id") REFERENCES "version_section" ("id"),
FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"),
FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id")
);
CREATE INDEX "version_section_cid_id" ON "version_section" ("cid_id");
CREATE INDEX "version_section_id_parent_id" ON "version_section" ("id_parent_id");
CREATE INDEX "version_section_texte_id" ON "version_section" ("texte_id");
CREATE INDEX "version_section_version_texte_id" ON "version_section" ("version_texte_id");
</syntaxhighlight>
; article
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "article" (
"id" VARCHAR(20) NOT NULL PRIMARY KEY,
"nom" VARCHAR(200) NOT NULL,
"etat_juridique" VARCHAR(25) NOT NULL,
"num" VARCHAR(200) NOT NULL,
"debut" DATE NOT NULL,
"fin" DATE,
"texte_id" VARCHAR(20) NOT NULL,
"version_section_id" VARCHAR(20) NOT NULL,
"version_texte_id" INTEGER NOT NULL,
FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"),
FOREIGN KEY ("version_section_id") REFERENCES "version_section" ("id"),
FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id")
);
CREATE INDEX "article_texte_id" ON "article" ("texte_id");
CREATE INDEX "article_version_section_id" ON "article" ("version_section_id");
CREATE INDEX "article_version_texte_id" ON "article" ("version_texte_id");
</syntaxhighlight>
[[Catégorie:Archéo Lex]]
fc87083f537baf36d5af8e45bcd0e662d4ebe1e3
Fichier:BDD Archéo Lex 1.0.svg
6
11
37
2014-12-21T18:25:01Z
Seb35
1
Licence WTFPL 2.0
Version BDD : 1.0
wikitext
text/x-wiki
Licence WTFPL 2.0
Version BDD : 1.0
27795a057532cde04720376daa498a67506a83c4
47
37
2014-12-23T12:06:44Z
Seb35
1
Seb35 a déplacé la page [[Fichier:BDD Archéo Lex.svg]] vers [[Fichier:BDD Archéo Lex 1.0.svg]] : numérotation de version
wikitext
text/x-wiki
Licence WTFPL 2.0
Version BDD : 1.0
27795a057532cde04720376daa498a67506a83c4
Archéo Lex/Base LEGI
0
12
39
2014-12-21T20:52:09Z
Seb35
1
tutorial pour parcourir la base LEGI
wikitext
text/x-wiki
Cette page explique le parsement (''parsing'') de la base LEGI en vue de créer le dépôt Git, en se concentrant sur les fichiers et balises XML importantes pour réaliser cette tâche. L’exemple d’illustration sera le code de la propriété intellectuelle (LEGITEXT000006069414).
De façon générale, pour un identifiant "LEGIABCD123456789012", le fichier XML sera accessible via le chemin "LEGI/ABCD/12/34/56/78/90/LEGIABCD123456789012.xml" (noter que les deux derniers chiffres n’ont pas de sous-répertoire dédié, le dernier sous-répertoire pouvant contenir jusqu’à 100 fichiers XML correspondant à ces deux derniers chiffres).
'''1.''' Aller dans le répertoire du code "legi/global/code_et_TNC_en_vigueur/code_en_vigueur/LEGI/TEXT/**/**/**/**/**/LEGITEXT************".
:Pour le CPI, cela sera le sous-dossier "legi/global/code_et_TNC_en_vigueur/code_en_vigueur/LEGI/TEXT/00/00/06/06/94/LEGITEXT000006069414".
:Ce dossier contient trois sous-dossiers :
:# "article" : contient tous les articles du code, rangés dans des sous-dossiers en fonction de leur identifiant
:# "section_ta" : similaire aux articles, mais pour les sections (les titres de parties)
:# "texte" : ce sous-dossier est celui qui nous intéressera en premier lieu car il contient les métadonnées de base du texte ainsi que les points d’entrée pour parcourir récursivement les sections et articles
'''2.''' Ouvrir le fichier "texte/version/LEGITEXT************.xml"
: Ce fichier XML contient les balises suivantes importantes :
:* TEXTE_VERSION / META / META_COMMUN / ID : identifiant du texte (que l’on avait déjà), par exemple "LEGITEXT000006069414" (l’ID désigne l’identifiant unique de l’objet XML (=texte, section ou article)
:* TEXTE_VERSION / META / META_COMMUN / NATURE : nature du texte, pour nous "CODE"
:* TEXTE_VERSION / META / META_SPEC / META_TEXTE_CHRONICLE / CID : identifiant du texte, par exemple "LEGITEXT000006069414" (il n’y a pas de différence ici avec l’ID précédent puisque l’objet XML est le texte lui-même, mais lorsqu’on parcourera les autres objets XML le champ CID sera toujours l’identifiant du texte)
:* TEXTE_VERSION / META / META_SPEC / META_TEXTE_CHRONICLE / DATE_PUBLI : date de publication au JO de l’objet XML (la date spéciale 2999-01-01 indique une absence de date ; pour les codes, il n’y en a pas sur textes eux-même mais uniquement sur les sections et articles)
:* TEXTE_VERSION / META / META_SPEC / META_TEXTE_CHRONICLE / DATE_TEXTE : date d’entrée en vigueur de l’objet XML, c’est-à-dire la date de référence pour les opérations de consolidation
:* TEXTE_VERSION / META / META_SPEC / META_TEXTE_VERSION / TITRE : titre du texte, par exemple "Code de la propriété intellectuelle"
:* TEXTE_VERSION / META / META_SPEC / META_TEXTE_VERSION / ETAT : statut juridique du texte, par exemple "VIGUEUR" (ou "ABROGE", "ANNULE", "MODIFIE", etc.)
'''3.''' Ouvrir le fichier "texte/struct/LEGITEXT************.xml"
: Ce fichier XML contient les sections (titres de parties) de plus haut niveau du texte avec, pour chacune, les dates où elles ont été en vigueur. Par exemple, on pourra avoir les sections "Partie législative" et "Partie réglementaire". Les balises importantes sont :
:* TEXTELR / META / META_COMMUN / ID : identifiant de l’objet XML, par exemple "LEGITEXT000006069414" (encore le même que le texte puisque ce fichier est unique pour un même code)
:* TEXTELR / META / META_SPEC / META_TEXTE_CHRONICLE / CID : identifiant du texte
:* TEXTELR / META / META_SPEC / META_TEXTE_CHRONICLE / DATE_PUBLI et DATE_TEXTE : date de publication au JO et date d’entrée en vigueur
:* TEXTELR / META / META_SPEC / META_TEXTE_CHRONICLE / DERNIERE_MODIFICATION : date de la dernière modification dans la base LEGI
:* TEXTELR / STRUCT / (LIEN_SECTION_TA)* : sections de plus haut niveau ; les attributs importants pour une balise donnée sont :
:** cid et id : identifiant de la section ; cela va nous permettre d’aller chercher récursivement les sections enfants de cette section dans l’étape suivante
:** debut, fin, etat : similaire à ce qu’on a déjà vu ; les dates sont les dates d’entrée en vigueur
:** niv : niveau de la section, il est à 1 pour l’instant et ira croissant en fonction de la profondeur de la section
:** le contenu de cette balise est le nom de la section
'''4.''' Ouvrir les fichiers "section_ta/LEGI/SCTA/**/**/**/**/**/**/LEGISCTA************.xml"
: Pour le CPI, on pourra prendre la première section ("Partie législative") avec le fichier "section_ta/LEGI/SCTA/00/00/06/08/36/LEGISCTA000006083673.xml".
: Ce fichier XML reprend les informations de la section en cours et indique les sections enfants. Les balises sont :
:* SECTION_TA / ID : identifiant de la section en cours
:* SECTION_TA / TITRE : titre de la section, par exemple "Partie législative"
:* SECTION_TA / CONTEXTE / TEXTE et TITRE_TXT : reprend les informations du texte auquel se rattache cette section, dont le cid (identifiant du texte)
:* SECTION_TA / STRUCTURE_TA / (LIEN_SECTION_TA)* : sections de niveau juste inférieur ; les attributs sont similaires à l’étape précédente, l’attribut cid est particulièrement important pour continuer la récursion ; le texte contenu dans cette balise est le nom de la section concernée (de niveau juste inférieur)
'''5.''' Continuer la récursion jusqu’à arriver à des sections comprenant des articles
: Pour le CPI, on pourra prendre "section_ta/LEGI/SCTA/00/00/06/16/16/LEGISCTA000006161633.xml" correspondant à la Partie législative, Première partie : La propriété littéraire et artistique, Livre Ier : Le droit d'auteur, Titre Ier : Objet du droit d'auteur, Chapitre Ier : Nature du droit d'auteur.
: Ce fichier XML est similaire aux sections parentes mais il contient les identifiants des articles, ainsi que l’état juridique des articles. Les nouvelles balises sont :
:* SECTION_TA / CONTEXTE / (TM / TITRE_TM)* : sections de niveau plus élevées, si besoin pour s’y retrouver
:* SECTION_TA / STRUCTURE_TA / (LIENT_ART)* : articles de la section ; les attributs sont classiques ; noter en particulier num qui contient le nom de l’article, par exemple "L111-1" ; noter que plusieurs balises peuvent avoir le même num lorsque leur état juridique est différent
'''6.''' Ouvrir les fichiers des articles "article/LEGI/ARTI/00/00/06/27/88/LEGIARTI000006278868.xml"
: Pour le CPI, on pourra prendre "article/LEGI/ARTI/00/00/06/27/88/LEGIARTI000006278868.xml" correspondant à l’article L111-1 en vigueur (il existe une précédente version de cet article L111-1 avec l’identifiant LEGIARTI000006278867).
: Ce fichier XML contient une version d’un article, comprenant les métadonnées de l’article, sa rédaction et des liens avec d’autres textes ou articles. Les balises sont :
:* ARTICLE / META / META_COMMUN / ID : identifiant de l’article ; les autres versions de l’article (portant le même nom) auront un identifiant différent
:* ARTICLE / META / META_SPEC / META_ARTICLE / NUM et ETAT : numéro/nom de l’article et son état juridique
:* ARTICLE / META / META_SPEC / META_ARTICLE / DATE_DEBUT et DATE_FIN : la date d’entrée en vigueur et de fin de vigueur ; si l’article est toujours en vigueur, sa date de fin devrait être 2999-01-01
:* ARTICLE / CONTEXTE : sections parentes de l’article et texte, similaire à ce qu’on trouvait dans les sections
:* ARTICLE / VERSIONS / (VERSION)* : autres versions de l’article, avec leurs états juridiques
:* ARTICLE / BLOC_TEXTUEL / CONTENU : rédaction de cette version de l’article, au format HTML
:* ARTICLE / LIENS / (LIEN)* : liens vers ou depuis d’autres articles, du même code ou d’autres textes ; historique de l’article lorsqu’il provient d’une loi antérieure ; lien vers le texte ayant mené à la codification du texte
606cd0d686bf4fb9e7db2086ea6f602e7e1bfb27
40
39
2014-12-21T21:05:01Z
Seb35
1
+cat
wikitext
text/x-wiki
Cette page explique le parsement (''parsing'') de la base LEGI en vue de créer le dépôt Git, en se concentrant sur les fichiers et balises XML importantes pour réaliser cette tâche. L’exemple d’illustration sera le code de la propriété intellectuelle (CPI) dont l’identifiant est LEGITEXT000006069414.
De façon générale, pour un identifiant "LEGIABCD123456789012", le fichier XML sera accessible via le chemin "LEGI/ABCD/12/34/56/78/90/LEGIABCD123456789012.xml" (noter que les deux derniers chiffres n’ont pas de sous-répertoire dédié, le dernier sous-répertoire pouvant contenir jusqu’à 100 fichiers XML correspondant à ces deux derniers chiffres).
'''1.''' Aller dans le répertoire du code "legi/global/code_et_TNC_en_vigueur/code_en_vigueur/LEGI/TEXT/**/**/**/**/**/LEGITEXT************".
:Pour le CPI, cela sera le sous-dossier "legi/global/code_et_TNC_en_vigueur/code_en_vigueur/LEGI/TEXT/00/00/06/06/94/LEGITEXT000006069414".
:Ce dossier contient trois sous-dossiers :
:# "article" : contient tous les articles du code, rangés dans des sous-dossiers en fonction de leur identifiant
:# "section_ta" : similaire aux articles, mais pour les sections (les titres de parties)
:# "texte" : ce sous-dossier est celui qui nous intéressera en premier lieu car il contient les métadonnées de base du texte ainsi que les points d’entrée pour parcourir récursivement les sections et articles
'''2.''' Ouvrir le fichier "texte/version/LEGITEXT************.xml"
: Ce fichier XML les métadonnées générales du texte. Il contient les balises suivantes importantes :
:* TEXTE_VERSION / META / META_COMMUN / ID : identifiant du texte (que l’on avait déjà), par exemple "LEGITEXT000006069414" (l’ID désigne l’identifiant unique de l’objet XML (=texte, section ou article)
:* TEXTE_VERSION / META / META_COMMUN / NATURE : nature du texte, pour nous "CODE"
:* TEXTE_VERSION / META / META_SPEC / META_TEXTE_CHRONICLE / CID : identifiant du texte, par exemple "LEGITEXT000006069414" (il n’y a pas de différence ici avec l’ID précédent puisque l’objet XML est le texte lui-même, mais lorsqu’on parcourera les autres objets XML le champ CID sera toujours l’identifiant du texte)
:* TEXTE_VERSION / META / META_SPEC / META_TEXTE_CHRONICLE / DATE_PUBLI : date de publication au JO de l’objet XML (la date spéciale 2999-01-01 indique une absence de date ; pour les codes, il n’y en a pas sur textes eux-même mais uniquement sur les sections et articles)
:* TEXTE_VERSION / META / META_SPEC / META_TEXTE_CHRONICLE / DATE_TEXTE : date d’entrée en vigueur de l’objet XML, c’est-à-dire la date de référence pour les opérations de consolidation
:* TEXTE_VERSION / META / META_SPEC / META_TEXTE_VERSION / TITRE : titre du texte, par exemple "Code de la propriété intellectuelle"
:* TEXTE_VERSION / META / META_SPEC / META_TEXTE_VERSION / ETAT : statut juridique du texte, par exemple "VIGUEUR" (ou "ABROGE", "ANNULE", "MODIFIE", etc.)
'''3.''' Ouvrir le fichier "texte/struct/LEGITEXT************.xml"
: Ce fichier XML contient les sections (titres de parties) de plus haut niveau du texte avec, pour chacune, les dates où elles ont été en vigueur. Par exemple, on pourra avoir les sections "Partie législative" et "Partie réglementaire". Les balises importantes sont :
:* TEXTELR / META / META_COMMUN / ID : identifiant de l’objet XML, par exemple "LEGITEXT000006069414" (encore le même que le texte puisque ce fichier est unique pour un même code)
:* TEXTELR / META / META_SPEC / META_TEXTE_CHRONICLE / CID : identifiant du texte
:* TEXTELR / META / META_SPEC / META_TEXTE_CHRONICLE / DATE_PUBLI et DATE_TEXTE : date de publication au JO et date d’entrée en vigueur
:* TEXTELR / META / META_SPEC / META_TEXTE_CHRONICLE / DERNIERE_MODIFICATION : date de la dernière modification dans la base LEGI
:* TEXTELR / STRUCT / (LIEN_SECTION_TA)* : sections de plus haut niveau ; les attributs importants pour une balise donnée sont :
:** cid et id : identifiant de la section ; cela va nous permettre d’aller chercher récursivement les sections enfants de cette section dans l’étape suivante
:** debut, fin, etat : similaire à ce qu’on a déjà vu ; les dates sont les dates d’entrée en vigueur
:** niv : niveau de la section, il est à 1 pour l’instant et ira croissant en fonction de la profondeur de la section
:** le contenu de cette balise est le nom de la section
'''4.''' Ouvrir les fichiers "section_ta/LEGI/SCTA/**/**/**/**/**/**/LEGISCTA************.xml"
: Pour le CPI, on pourra prendre la première section ("Partie législative") avec le fichier "section_ta/LEGI/SCTA/00/00/06/08/36/LEGISCTA000006083673.xml".
: Ce fichier XML reprend les informations de la section en cours et indique les sections enfants. Les balises sont :
:* SECTION_TA / ID : identifiant de la section en cours
:* SECTION_TA / TITRE : titre de la section, par exemple "Partie législative"
:* SECTION_TA / CONTEXTE / TEXTE et TITRE_TXT : reprend les informations du texte auquel se rattache cette section, dont le cid (identifiant du texte)
:* SECTION_TA / STRUCTURE_TA / (LIEN_SECTION_TA)* : sections de niveau juste inférieur ; les attributs sont similaires à l’étape précédente, l’attribut cid est particulièrement important pour continuer la récursion ; le texte contenu dans cette balise est le nom de la section concernée (de niveau juste inférieur)
'''5.''' Continuer la récursion jusqu’à arriver à des sections comprenant des articles
: Pour le CPI, on pourra prendre "section_ta/LEGI/SCTA/00/00/06/16/16/LEGISCTA000006161633.xml" correspondant à la Partie législative, Première partie : La propriété littéraire et artistique, Livre Ier : Le droit d'auteur, Titre Ier : Objet du droit d'auteur, Chapitre Ier : Nature du droit d'auteur.
: Ce fichier XML est similaire aux sections parentes mais il contient les identifiants des articles, ainsi que l’état juridique des articles. Les nouvelles balises sont :
:* SECTION_TA / CONTEXTE / (TM / TITRE_TM)* : sections de niveau plus élevées, si besoin pour s’y retrouver
:* SECTION_TA / STRUCTURE_TA / (LIENT_ART)* : articles de la section ; les attributs sont classiques ; noter en particulier num qui contient le nom de l’article, par exemple "L111-1" ; noter que plusieurs balises peuvent avoir le même num lorsque leur état juridique est différent
'''6.''' Ouvrir les fichiers des articles "article/LEGI/ARTI/00/00/06/27/88/LEGIARTI000006278868.xml"
: Pour le CPI, on pourra prendre "article/LEGI/ARTI/00/00/06/27/88/LEGIARTI000006278868.xml" correspondant à l’article L111-1 en vigueur (il existe une précédente version de cet article L111-1 avec l’identifiant LEGIARTI000006278867).
: Ce fichier XML contient une version d’un article, comprenant les métadonnées de l’article, sa rédaction et des liens avec d’autres textes ou articles. Les balises sont :
:* ARTICLE / META / META_COMMUN / ID : identifiant de l’article ; les autres versions de l’article (portant le même nom) auront un identifiant différent
:* ARTICLE / META / META_SPEC / META_ARTICLE / NUM et ETAT : numéro/nom de l’article et son état juridique
:* ARTICLE / META / META_SPEC / META_ARTICLE / DATE_DEBUT et DATE_FIN : la date d’entrée en vigueur et de fin de vigueur ; si l’article est toujours en vigueur, sa date de fin devrait être 2999-01-01
:* ARTICLE / CONTEXTE : sections parentes de l’article et texte, similaire à ce qu’on trouvait dans les sections
:* ARTICLE / VERSIONS / (VERSION)* : autres versions de l’article, avec leurs états juridiques
:* ARTICLE / BLOC_TEXTUEL / CONTENU : rédaction de cette version de l’article, au format HTML
:* ARTICLE / LIENS / (LIEN)* : liens vers ou depuis d’autres articles, du même code ou d’autres textes ; historique de l’article lorsqu’il provient d’une loi antérieure ; lien vers le texte ayant mené à la codification du texte
[[Catégorie:Archéo Lex]]
7edcd22c2ab6003444daef2f8390402d52db69ee
41
40
2014-12-21T21:08:50Z
Seb35
1
typo
wikitext
text/x-wiki
Cette page explique le parsement (''parsing'') de la base LEGI en vue de créer le dépôt Git, en se concentrant sur les fichiers et balises XML importantes pour réaliser cette tâche. L’exemple d’illustration sera le code de la propriété intellectuelle (CPI) dont l’identifiant est LEGITEXT000006069414.
De façon générale, pour un identifiant "LEGIABCD123456789012", le fichier XML sera accessible via le chemin "LEGI/ABCD/12/34/56/78/90/LEGIABCD123456789012.xml" (noter que les deux derniers chiffres n’ont pas de sous-répertoire dédié, le dernier sous-répertoire pouvant contenir jusqu’à 100 fichiers XML correspondant à ces deux derniers chiffres).
'''1.''' Aller dans le répertoire du code "legi/global/code_et_TNC_en_vigueur/code_en_vigueur/LEGI/TEXT/**/**/**/**/**/LEGITEXT************".
:Pour le CPI, cela sera le sous-dossier "legi/global/code_et_TNC_en_vigueur/code_en_vigueur/LEGI/TEXT/00/00/06/06/94/LEGITEXT000006069414".
:Ce dossier contient trois sous-dossiers :
:* "article" : contient tous les articles du code, rangés dans des sous-dossiers en fonction de leur identifiant
:* "section_ta" : similaire aux articles, mais pour les sections (les titres de parties)
:* "texte" : ce sous-dossier est celui qui nous intéressera en premier lieu car il contient les métadonnées de base du texte ainsi que les points d’entrée pour parcourir récursivement les sections et articles
'''2.''' Ouvrir le fichier "texte/version/LEGITEXT************.xml"
: Pour le CPI, le fichier est "texte/version/LEGITEXT000006069414.xml".
: Ce fichier XML les métadonnées générales du texte. Il contient les balises suivantes importantes :
:* TEXTE_VERSION / META / META_COMMUN / ID : identifiant du texte (que l’on avait déjà), par exemple "LEGITEXT000006069414" (l’ID désigne l’identifiant unique de l’objet XML (=texte, section ou article)
:* TEXTE_VERSION / META / META_COMMUN / NATURE : nature du texte, pour nous "CODE"
:* TEXTE_VERSION / META / META_SPEC / META_TEXTE_CHRONICLE / CID : identifiant du texte, par exemple "LEGITEXT000006069414" (il n’y a pas de différence ici avec l’ID précédent puisque l’objet XML est le texte lui-même, mais lorsqu’on parcourera les autres objets XML le champ CID sera toujours l’identifiant du texte)
:* TEXTE_VERSION / META / META_SPEC / META_TEXTE_CHRONICLE / DATE_PUBLI : date de publication au JO de l’objet XML (la date spéciale 2999-01-01 indique une absence de date ; pour les codes, il n’y en a pas sur textes eux-même mais uniquement sur les sections et articles)
:* TEXTE_VERSION / META / META_SPEC / META_TEXTE_CHRONICLE / DATE_TEXTE : date d’entrée en vigueur de l’objet XML, c’est-à-dire la date de référence pour les opérations de consolidation
:* TEXTE_VERSION / META / META_SPEC / META_TEXTE_VERSION / TITRE : titre du texte, par exemple "Code de la propriété intellectuelle"
:* TEXTE_VERSION / META / META_SPEC / META_TEXTE_VERSION / ETAT : statut juridique du texte, par exemple "VIGUEUR" (ou "ABROGE", "ANNULE", "MODIFIE", etc.)
'''3.''' Ouvrir le fichier "texte/struct/LEGITEXT************.xml"
: Pour le CPI, le fichier est "texte/struct/LEGITEXT000006069414.xml".
: Ce fichier XML contient les sections (titres de parties) de plus haut niveau du texte avec, pour chacune, les dates où elles ont été en vigueur. Par exemple, on pourra avoir les sections "Partie législative" et "Partie réglementaire". Les balises importantes sont :
:* TEXTELR / META / META_COMMUN / ID : identifiant de l’objet XML, par exemple "LEGITEXT000006069414" (encore le même que le texte puisque ce fichier est unique pour un même code)
:* TEXTELR / META / META_SPEC / META_TEXTE_CHRONICLE / CID : identifiant du texte
:* TEXTELR / META / META_SPEC / META_TEXTE_CHRONICLE / DATE_PUBLI et DATE_TEXTE : date de publication au JO et date d’entrée en vigueur
:* TEXTELR / META / META_SPEC / META_TEXTE_CHRONICLE / DERNIERE_MODIFICATION : date de la dernière modification dans la base LEGI
:* TEXTELR / STRUCT / (LIEN_SECTION_TA)* : sections de plus haut niveau ; les attributs importants pour une balise donnée sont :
:** cid et id : identifiant de la section ; cela va nous permettre d’aller chercher récursivement les sections enfants de cette section dans l’étape suivante
:** debut, fin, etat : similaire à ce qu’on a déjà vu ; les dates sont les dates d’entrée en vigueur
:** niv : niveau de la section, il est à 1 pour l’instant et ira croissant en fonction de la profondeur de la section
:** le contenu de cette balise est le nom de la section
'''4.''' Ouvrir les fichiers "section_ta/LEGI/SCTA/**/**/**/**/**/**/LEGISCTA************.xml"
: Pour le CPI, on pourra prendre la première section ("Partie législative") avec le fichier "section_ta/LEGI/SCTA/00/00/06/08/36/LEGISCTA000006083673.xml".
: Ce fichier XML reprend les informations de la section en cours et indique les sections enfants. Les balises sont :
:* SECTION_TA / ID : identifiant de la section en cours
:* SECTION_TA / TITRE : titre de la section, par exemple "Partie législative"
:* SECTION_TA / CONTEXTE / TEXTE et TITRE_TXT : reprend les informations du texte auquel se rattache cette section, dont le cid (identifiant du texte)
:* SECTION_TA / STRUCTURE_TA / (LIEN_SECTION_TA)* : sections de niveau juste inférieur ; les attributs sont similaires à l’étape précédente, l’attribut cid est particulièrement important pour continuer la récursion ; le texte contenu dans cette balise est le nom de la section concernée (de niveau juste inférieur)
'''5.''' Continuer la récursion jusqu’à arriver à des sections comprenant des articles
: Pour le CPI, on pourra prendre "section_ta/LEGI/SCTA/00/00/06/16/16/LEGISCTA000006161633.xml" correspondant à la Partie législative → Première partie : La propriété littéraire et artistique → Livre Ier : Le droit d'auteur → Titre Ier : Objet du droit d'auteur → Chapitre Ier : Nature du droit d'auteur.
: Ce fichier XML est similaire aux sections parentes mais il contient les identifiants des articles, ainsi que l’état juridique des articles. Les nouvelles balises sont :
:* SECTION_TA / CONTEXTE / (TM / TITRE_TM)* : sections de niveau plus élevées, si besoin pour s’y retrouver
:* SECTION_TA / STRUCTURE_TA / (LIENT_ART)* : articles de la section ; les attributs sont classiques ; noter en particulier num qui contient le nom de l’article, par exemple "L111-1" ; noter que plusieurs balises peuvent avoir le même num lorsque leur état juridique est différent
'''6.''' Ouvrir les fichiers des articles "article/LEGI/ARTI/00/00/06/27/88/LEGIARTI000006278868.xml"
: Pour le CPI, on pourra prendre "article/LEGI/ARTI/00/00/06/27/88/LEGIARTI000006278868.xml" correspondant à l’article L111-1 en vigueur (il existe une précédente version de cet article L111-1 avec l’identifiant LEGIARTI000006278867).
: Ce fichier XML contient une version d’un article, comprenant les métadonnées de l’article, sa rédaction et des liens avec d’autres textes ou articles. Les balises sont :
:* ARTICLE / META / META_COMMUN / ID : identifiant de l’article ; les autres versions de l’article (portant le même nom) auront un identifiant différent
:* ARTICLE / META / META_SPEC / META_ARTICLE / NUM et ETAT : numéro/nom de l’article et son état juridique
:* ARTICLE / META / META_SPEC / META_ARTICLE / DATE_DEBUT et DATE_FIN : la date d’entrée en vigueur et de fin de vigueur ; si l’article est toujours en vigueur, sa date de fin devrait être 2999-01-01
:* ARTICLE / CONTEXTE : sections parentes de l’article et texte, similaire à ce qu’on trouvait dans les sections
:* ARTICLE / VERSIONS / (VERSION)* : autres versions de l’article, avec leurs états juridiques
:* ARTICLE / BLOC_TEXTUEL / CONTENU : rédaction de cette version de l’article, au format HTML
:* ARTICLE / LIENS / (LIEN)* : liens vers ou depuis d’autres articles, du même code ou d’autres textes ; historique de l’article lorsqu’il provient d’une loi antérieure ; lien vers le texte ayant mené à la codification du texte
[[Catégorie:Archéo Lex]]
ee86e6ad5529c95d8c9d1b9ee4c3ddafae295c01
42
41
2014-12-21T23:48:30Z
Seb35
1
typo
wikitext
text/x-wiki
Cette page explique le parsement (''parsing'') de la base LEGI en vue de créer le dépôt Git, en se concentrant sur les fichiers et balises XML importantes pour réaliser cette tâche. L’exemple d’illustration sera le code de la propriété intellectuelle (CPI) dont l’identifiant est LEGITEXT000006069414.
De façon générale, pour un identifiant "LEGIABCD123456789012", le fichier XML sera accessible via le chemin "LEGI/ABCD/12/34/56/78/90/LEGIABCD123456789012.xml" (noter que les deux derniers chiffres n’ont pas de sous-répertoire dédié, le dernier sous-répertoire pouvant contenir jusqu’à 100 fichiers XML correspondant à ces deux derniers chiffres).
'''1.''' Aller dans le répertoire du code "legi/global/code_et_TNC_en_vigueur/code_en_vigueur/LEGI/TEXT/**/**/**/**/**/LEGITEXT************".
:Pour le CPI, cela sera le sous-dossier "legi/global/code_et_TNC_en_vigueur/code_en_vigueur/LEGI/TEXT/00/00/06/06/94/LEGITEXT000006069414".
:Ce dossier contient trois sous-dossiers :
:* "article" : contient tous les articles du code, rangés dans des sous-dossiers en fonction de leur identifiant
:* "section_ta" : similaire aux articles, mais pour les sections (les titres de parties)
:* "texte" : ce sous-dossier est celui qui nous intéressera en premier lieu car il contient les métadonnées de base du texte ainsi que les points d’entrée pour parcourir récursivement les sections et articles
'''2.''' Ouvrir le fichier "texte/version/LEGITEXT************.xml"
: Pour le CPI, le fichier est "texte/version/LEGITEXT000006069414.xml".
: Ce fichier XML les métadonnées générales du texte. Il contient les balises suivantes importantes :
:* TEXTE_VERSION / META / META_COMMUN / ID : identifiant du texte (que l’on avait déjà), par exemple "LEGITEXT000006069414" (l’ID désigne l’identifiant unique de l’objet XML (=texte, section ou article)
:* TEXTE_VERSION / META / META_COMMUN / NATURE : nature du texte, pour nous "CODE"
:* TEXTE_VERSION / META / META_SPEC / META_TEXTE_CHRONICLE / CID : identifiant du texte, par exemple "LEGITEXT000006069414" (il n’y a pas de différence ici avec l’ID précédent puisque l’objet XML est le texte lui-même, mais lorsqu’on parcourera les autres objets XML le champ CID sera toujours l’identifiant du texte)
:* TEXTE_VERSION / META / META_SPEC / META_TEXTE_CHRONICLE / DATE_PUBLI : date de publication au JO de l’objet XML (la date spéciale 2999-01-01 indique une absence de date ; pour les codes, il n’y en a pas sur textes eux-même mais uniquement sur les sections et articles)
:* TEXTE_VERSION / META / META_SPEC / META_TEXTE_CHRONICLE / DATE_TEXTE : date d’entrée en vigueur de l’objet XML, c’est-à-dire la date de référence pour les opérations de consolidation
:* TEXTE_VERSION / META / META_SPEC / META_TEXTE_VERSION / TITRE : titre du texte, par exemple "Code de la propriété intellectuelle"
:* TEXTE_VERSION / META / META_SPEC / META_TEXTE_VERSION / ETAT : statut juridique du texte, par exemple "VIGUEUR" (ou "ABROGE", "ANNULE", "MODIFIE", etc.)
'''3.''' Ouvrir le fichier "texte/struct/LEGITEXT************.xml"
: Pour le CPI, le fichier est "texte/struct/LEGITEXT000006069414.xml".
: Ce fichier XML contient les sections (titres de parties) de plus haut niveau du texte avec, pour chacune, les dates où elles ont été en vigueur. Par exemple, on pourra avoir les sections "Partie législative" et "Partie réglementaire". Les balises importantes sont :
:* TEXTELR / META / META_COMMUN / ID : identifiant de l’objet XML, par exemple "LEGITEXT000006069414" (encore le même que le texte puisque ce fichier est unique pour un même code)
:* TEXTELR / META / META_SPEC / META_TEXTE_CHRONICLE / CID : identifiant du texte
:* TEXTELR / META / META_SPEC / META_TEXTE_CHRONICLE / DATE_PUBLI et DATE_TEXTE : date de publication au JO et date d’entrée en vigueur
:* TEXTELR / META / META_SPEC / META_TEXTE_CHRONICLE / DERNIERE_MODIFICATION : date de la dernière modification dans la base LEGI
:* TEXTELR / STRUCT / (LIEN_SECTION_TA)* : sections de plus haut niveau ; les attributs importants pour une balise donnée sont :
:** cid et id : identifiant de la section ; cela va nous permettre d’aller chercher récursivement les sections enfants de cette section dans l’étape suivante
:** debut, fin, etat : similaire à ce qu’on a déjà vu ; les dates sont les dates d’entrée en vigueur
:** niv : niveau de la section, il est à 1 pour l’instant et ira croissant en fonction de la profondeur de la section
:** le contenu de cette balise est le nom de la section
'''4.''' Ouvrir les fichiers "section_ta/LEGI/SCTA/**/**/**/**/**/**/LEGISCTA************.xml"
: Pour le CPI, on pourra prendre la première section ("Partie législative") avec le fichier "section_ta/LEGI/SCTA/00/00/06/08/36/LEGISCTA000006083673.xml".
: Ce fichier XML reprend les informations de la section en cours et indique les sections enfants. Les balises sont :
:* SECTION_TA / ID : identifiant de la section en cours
:* SECTION_TA / TITRE : titre de la section, par exemple "Partie législative"
:* SECTION_TA / CONTEXTE / TEXTE et TITRE_TXT : reprend les informations du texte auquel se rattache cette section, dont le cid (identifiant du texte)
:* SECTION_TA / STRUCTURE_TA / (LIEN_SECTION_TA)* : sections de niveau juste inférieur ; les attributs sont similaires à l’étape précédente, l’attribut cid est particulièrement important pour continuer la récursion ; le texte contenu dans cette balise est le nom de la section concernée (de niveau juste inférieur)
'''5.''' Continuer la récursion jusqu’à arriver à des sections comprenant des articles
: Pour le CPI, on pourra prendre "section_ta/LEGI/SCTA/00/00/06/16/16/LEGISCTA000006161633.xml" correspondant à la Partie législative → Première partie : La propriété littéraire et artistique → Livre Ier : Le droit d'auteur → Titre Ier : Objet du droit d'auteur → Chapitre Ier : Nature du droit d'auteur.
: Ce fichier XML est similaire aux sections parentes mais il contient les identifiants des articles, ainsi que l’état juridique des articles. Les nouvelles balises sont :
:* SECTION_TA / CONTEXTE / (TM / TITRE_TM)* : sections de niveau plus élevées, si besoin pour s’y retrouver
:* SECTION_TA / STRUCTURE_TA / (LIEN_ART)* : articles de la section ; les attributs sont classiques ; noter en particulier num qui contient le nom de l’article, par exemple "L111-1" ; noter que plusieurs balises peuvent avoir le même num lorsque leur état juridique est différent
'''6.''' Ouvrir les fichiers des articles "article/LEGI/ARTI/00/00/06/27/88/LEGIARTI000006278868.xml"
: Pour le CPI, on pourra prendre "article/LEGI/ARTI/00/00/06/27/88/LEGIARTI000006278868.xml" correspondant à l’article L111-1 en vigueur (il existe une précédente version de cet article L111-1 avec l’identifiant LEGIARTI000006278867).
: Ce fichier XML contient une version d’un article, comprenant les métadonnées de l’article, sa rédaction et des liens avec d’autres textes ou articles. Les balises sont :
:* ARTICLE / META / META_COMMUN / ID : identifiant de l’article ; les autres versions de l’article (portant le même nom) auront un identifiant différent
:* ARTICLE / META / META_SPEC / META_ARTICLE / NUM et ETAT : numéro/nom de l’article et son état juridique
:* ARTICLE / META / META_SPEC / META_ARTICLE / DATE_DEBUT et DATE_FIN : la date d’entrée en vigueur et de fin de vigueur ; si l’article est toujours en vigueur, sa date de fin devrait être 2999-01-01
:* ARTICLE / CONTEXTE : sections parentes de l’article et texte, similaire à ce qu’on trouvait dans les sections
:* ARTICLE / VERSIONS / (VERSION)* : autres versions de l’article, avec leurs états juridiques
:* ARTICLE / BLOC_TEXTUEL / CONTENU : rédaction de cette version de l’article, au format HTML
:* ARTICLE / LIENS / (LIEN)* : liens vers ou depuis d’autres articles, du même code ou d’autres textes ; historique de l’article lorsqu’il provient d’une loi antérieure ; lien vers le texte ayant mené à la codification du texte
[[Catégorie:Archéo Lex]]
152d37d79bd0a67d2fab3f4c2a2b6a8390d621df
43
42
2014-12-22T09:52:53Z
Seb35
1
+autres textes de LEGI
wikitext
text/x-wiki
Cette page explique le parsement (''parsing'') de la base LEGI en vue de créer le dépôt Git, en se concentrant sur les fichiers et balises XML importantes pour réaliser cette tâche. L’exemple d’illustration sera le code de la propriété intellectuelle (CPI) dont l’identifiant est LEGITEXT000006069414.
De façon générale, pour un identifiant "LEGIABCD123456789012", le fichier XML sera accessible via le chemin "LEGI/ABCD/12/34/56/78/90/LEGIABCD123456789012.xml" (noter que les deux derniers chiffres n’ont pas de sous-répertoire dédié, le dernier sous-répertoire pouvant contenir jusqu’à 100 fichiers XML correspondant à ces deux derniers chiffres).
'''1.''' Aller dans le répertoire du code "legi/global/code_et_TNC_en_vigueur/code_en_vigueur/LEGI/TEXT/**/**/**/**/**/LEGITEXT************".
:Pour le CPI, cela sera le sous-dossier "legi/global/code_et_TNC_en_vigueur/code_en_vigueur/LEGI/TEXT/00/00/06/06/94/LEGITEXT000006069414".
:Ce dossier contient trois sous-dossiers :
:* "article" : contient tous les articles du code, rangés dans des sous-dossiers en fonction de leur identifiant
:* "section_ta" : similaire aux articles, mais pour les sections (les titres de parties)
:* "texte" : ce sous-dossier est celui qui nous intéressera en premier lieu car il contient les métadonnées de base du texte ainsi que les points d’entrée pour parcourir récursivement les sections et articles
'''2.''' Ouvrir le fichier "texte/version/LEGITEXT************.xml"
: Pour le CPI, le fichier est "texte/version/LEGITEXT000006069414.xml".
: Ce fichier XML les métadonnées générales du texte. Il contient les balises suivantes importantes :
:* TEXTE_VERSION / META / META_COMMUN / ID : identifiant du texte (que l’on avait déjà), par exemple "LEGITEXT000006069414" (l’ID désigne l’identifiant unique de l’objet XML (=texte, section ou article)
:* TEXTE_VERSION / META / META_COMMUN / NATURE : nature du texte, pour nous "CODE"
:* TEXTE_VERSION / META / META_SPEC / META_TEXTE_CHRONICLE / CID : identifiant du texte, par exemple "LEGITEXT000006069414" (il n’y a pas de différence ici avec l’ID précédent puisque l’objet XML est le texte lui-même, mais lorsqu’on parcourera les autres objets XML le champ CID sera toujours l’identifiant du texte)
:* TEXTE_VERSION / META / META_SPEC / META_TEXTE_CHRONICLE / DATE_PUBLI : date de publication au JO du texte (la date spéciale 2999-01-01 indique une absence de date ; pour les codes, il n’y en a pas sur textes eux-même mais uniquement sur les sections et articles)
:* TEXTE_VERSION / META / META_SPEC / META_TEXTE_CHRONICLE / DATE_TEXTE : date d’entrée de signature du texte
:* TEXTE_VERSION / META / META_SPEC / META_TEXTE_VERSION / TITRE : titre du texte, par exemple "Code de la propriété intellectuelle"
:* TEXTE_VERSION / META / META_SPEC / META_TEXTE_VERSION / ETAT : statut juridique du texte, par exemple "VIGUEUR" (ou "ABROGE", "ANNULE", "MODIFIE", etc.)
'''3.''' Ouvrir le fichier "texte/struct/LEGITEXT************.xml"
: Pour le CPI, le fichier est "texte/struct/LEGITEXT000006069414.xml".
: Ce fichier XML contient les sections (titres de parties) de plus haut niveau du texte avec, pour chacune, les dates où elles ont été en vigueur. Par exemple, on pourra avoir les sections "Partie législative" et "Partie réglementaire". Les balises importantes sont :
:* TEXTELR / META / META_COMMUN / ID : identifiant de l’objet XML, par exemple "LEGITEXT000006069414" (encore le même que le texte puisque ce fichier est unique pour un même code)
:* TEXTELR / META / META_SPEC / META_TEXTE_CHRONICLE / CID : identifiant du texte
:* TEXTELR / META / META_SPEC / META_TEXTE_CHRONICLE / DATE_PUBLI et DATE_TEXTE : date de publication au JO et date d’entrée en vigueur
:* TEXTELR / META / META_SPEC / META_TEXTE_CHRONICLE / DERNIERE_MODIFICATION : date de la dernière modification dans la base LEGI
:* TEXTELR / STRUCT / (LIEN_SECTION_TA)* : sections de plus haut niveau ; les attributs importants pour une balise donnée sont :
:** cid et id : identifiant de la section ; cela va nous permettre d’aller chercher récursivement les sections enfants de cette section dans l’étape suivante
:** debut, fin, etat : similaire à ce qu’on a déjà vu ; les dates sont les dates d’entrée en vigueur
:** niv : niveau de la section, il est à 1 pour l’instant et ira croissant en fonction de la profondeur de la section
:** le contenu de cette balise est le nom de la section
'''4.''' Ouvrir les fichiers "section_ta/LEGI/SCTA/**/**/**/**/**/**/LEGISCTA************.xml"
: Pour le CPI, on pourra prendre la première section ("Partie législative") avec le fichier "section_ta/LEGI/SCTA/00/00/06/08/36/LEGISCTA000006083673.xml".
: Ce fichier XML reprend les informations de la section en cours et indique les sections enfants. Les balises sont :
:* SECTION_TA / ID : identifiant de la section en cours
:* SECTION_TA / TITRE : titre de la section, par exemple "Partie législative"
:* SECTION_TA / CONTEXTE / TEXTE et TITRE_TXT : reprend les informations du texte auquel se rattache cette section, dont le cid (identifiant du texte)
:* SECTION_TA / STRUCTURE_TA / (LIEN_SECTION_TA)* : sections de niveau juste inférieur ; les attributs sont similaires à l’étape précédente, l’attribut cid est particulièrement important pour continuer la récursion ; le texte contenu dans cette balise est le nom de la section concernée (de niveau juste inférieur)
'''5.''' Continuer la récursion jusqu’à arriver à des sections comprenant des articles
: Pour le CPI, on pourra prendre "section_ta/LEGI/SCTA/00/00/06/16/16/LEGISCTA000006161633.xml" correspondant à la Partie législative → Première partie : La propriété littéraire et artistique → Livre Ier : Le droit d'auteur → Titre Ier : Objet du droit d'auteur → Chapitre Ier : Nature du droit d'auteur.
: Ce fichier XML est similaire aux sections parentes mais il contient les identifiants des articles, ainsi que l’état juridique des articles. Les nouvelles balises sont :
:* SECTION_TA / CONTEXTE / (TM / TITRE_TM)* : sections de niveau plus élevées, si besoin pour s’y retrouver
:* SECTION_TA / STRUCTURE_TA / (LIEN_ART)* : articles de la section ; les attributs sont classiques ; noter en particulier num qui contient le nom de l’article, par exemple "L111-1" ; noter que plusieurs balises peuvent avoir le même num lorsque leur état juridique est différent
'''6.''' Ouvrir les fichiers des articles "article/LEGI/ARTI/00/00/06/27/88/LEGIARTI000006278868.xml"
: Pour le CPI, on pourra prendre "article/LEGI/ARTI/00/00/06/27/88/LEGIARTI000006278868.xml" correspondant à l’article L111-1 en vigueur (il existe une précédente version de cet article L111-1 avec l’identifiant LEGIARTI000006278867).
: Ce fichier XML contient une version d’un article, comprenant les métadonnées de l’article, sa rédaction et des liens avec d’autres textes ou articles. Les balises sont :
:* ARTICLE / META / META_COMMUN / ID : identifiant de l’article ; les autres versions de l’article (portant le même nom) auront un identifiant différent
:* ARTICLE / META / META_SPEC / META_ARTICLE / NUM et ETAT : numéro/nom de l’article et son état juridique
:* ARTICLE / META / META_SPEC / META_ARTICLE / DATE_DEBUT et DATE_FIN : la date d’entrée en vigueur et de fin de vigueur ; si l’article est toujours en vigueur, sa date de fin devrait être 2999-01-01
:* ARTICLE / CONTEXTE : sections parentes de l’article et texte, similaire à ce qu’on trouvait dans les sections
:* ARTICLE / VERSIONS / (VERSION)* : autres versions de l’article, avec leurs états juridiques
:* ARTICLE / BLOC_TEXTUEL / CONTENU : rédaction de cette version de l’article, au format HTML
:* ARTICLE / LIENS / (LIEN)* : liens vers ou depuis d’autres articles, du même code ou d’autres textes ; historique de l’article lorsqu’il provient d’une loi antérieure ; lien vers le texte ayant mené à la codification du texte
Pour les lois, décrets, arrêtés et autres, la structure est similaire mais généralement plus simple puisqu’il n’y a pas de sections. Les lois sont dans le dossier "legi/global/code_et_TNC_en_vigueur/TNC_en_vigueur" (abréviation de "textes non codifiés") et sont transférées dans "legi/global/code_et_TNC_non_vigueur/TNC_non_vigueur" lorsqu’elles ne sont plus en vigueur (probablement comme les codes, mais ceux-ci ont une durée de vie longue).
L’espace de noms "JORFTEXT" est plus difficile à explorer : il est étalé sur les sections TNC_en_vigueur et TNC_non_vigueur, il peut contenir des objets de l’espace de noms LEGITEXT. Le sous-dossier "texte/version" peut alors contenir un ou plusieurs fichiers LEGITEXT.
[[Catégorie:Archéo Lex]]
baa5174ee80c012d1667d0c371c39aaab0e02380
Catégorie:Archéo Lex
14
13
46
2014-12-22T14:05:34Z
Seb35
1
création
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
Fichier:BDD Archéo Lex.svg
6
14
48
2014-12-23T12:06:44Z
Seb35
1
Seb35 a déplacé la page [[Fichier:BDD Archéo Lex.svg]] vers [[Fichier:BDD Archéo Lex 1.0.svg]] : numérotation de version
wikitext
text/x-wiki
#REDIRECTION [[Fichier:BDD Archéo Lex 1.0.svg]]
bcaf49df040798d319ffeb44d47f5e26bb7d98b4
Fichier:BDD Archéo Lex 2.1.svg
6
15
50
2014-12-23T12:09:46Z
Seb35
1
Licence WTFPL 2.0
Version BDD : 2.0
wikitext
text/x-wiki
Licence WTFPL 2.0
Version BDD : 2.0
ae9c4b3047e013e2fb2376f9ab24779f5e09cc18
Archéo Lex/Base de données
0
10
51
49
2014-12-23T12:13:17Z
Seb35
1
+schéma 2.0
wikitext
text/x-wiki
Archéo Lex importe les codes de la base LEGI dans un base de données SQLite. Cette base de données SQLite permet d’avoir de pouvoir requêter facilement afin de créer les textes de loi dans les formats demandés, ainsi que de pouvoir recréer des textes déjà compilés (''reproductible data''), sous réserve d’avoir encore les textes des articles dans leur version d’alors puisqu’ils ne sont pas enregistrés pour des questions de place.
== Structure ==
La base de données comprend deux types d’informations :
# la base LEGI en tant que donnée brute importée : tables <tt>texte</tt>, <tt>section</tt>, <tt>article</tt> avec diverses métadonnées ;
# les versions consolidées des codes tels que calculés par le programme, puisque cette information n’est pas donnée explicitement dans la base LEGI (il faut rassembler toutes les dates de consolidation mentionnées pour obtenir l’ensemble des versions consolidées) : tables <tt>version_texte</tt>, <tt>version_section</tt>.
De plus, pour permettre de modifier de façon incrémentale les dépôts Git en sortie au fur et à mesure de la mise à jour de la base LEGI, chaque enregistrement dans la base de données est également étiqueté avec la date de la dernière mise à jour du code dans la base LEGI <span style="color:red">[il faut ajouter ces tags dans la BDD]</span>. Ainsi, lorsqu’une section est mise à jour dans la base LEGI, un enregistrement dans <tt>version_section</tt> est créé <u>ainsi qu’un nouveau lien entre <tt>article</tt> et <tt>version_section</tt></u> <span style="color:red">[il faut ajouter une table version_section_article ou version_article]</span>. De même, lorsqu’un article est mis à jour dans la base LEGI, un enregistrement dans <tt>article</tt> <span style="color:red">[ou version_article]</span> ainsi qu’un lien <span style="color:red">[même remarque que précédemment]</span>.
== Schéma SQL 1.0 ==
[[Fichier:BDD Archéo Lex 1.0.svg|center]]
; texte
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "texte" (
"cid" VARCHAR(20) NOT NULL PRIMARY KEY,
"nor" VARCHAR(20) NOT NULL,
"nature" VARCHAR(20) NOT NULL,
"date_texte" DATE,
"date_publi" DATE
);
</syntaxhighlight>
; version_texte
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "version_texte" (
"id" INTEGER NOT NULL PRIMARY KEY,
"texte_id" VARCHAR(20) NOT NULL,
"titre" VARCHAR(200) NOT NULL,
"titre_long" VARCHAR(200) NOT NULL,
"etat_juridique" VARCHAR(25) NOT NULL,
"debut" DATE,
"fin" DATE,
"base_id" INTEGER,
FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"),
FOREIGN KEY ("base_id") REFERENCES "version_texte" ("id")
);
CREATE INDEX "version_texte_base_id" ON "version_texte" ("base_id");
CREATE INDEX "version_texte_texte_id" ON "version_texte" ("texte_id");
</syntaxhighlight>
; section
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "section" (
"cid" VARCHAR(20) NOT NULL PRIMARY KEY,
"cid_parent_id" VARCHAR(20),
"niveau" INTEGER NOT NULL,
"texte_id" VARCHAR(20) NOT NULL,
FOREIGN KEY ("cid_parent_id") REFERENCES "section" ("cid"),
FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid")
);
CREATE INDEX "section_cid_parent_id" ON "section" ("cid_parent_id");
CREATE INDEX "section_texte_id" ON "section" ("texte_id");
</syntaxhighlight>
; version_section
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "version_section" (
"id" VARCHAR(20) NOT NULL PRIMARY KEY,
"cid_id" VARCHAR(20) NOT NULL,
"id_parent_id" VARCHAR(20),
"nom" VARCHAR(200) NOT NULL,
"etat_juridique" VARCHAR(25) NOT NULL,
"niveau" INTEGER NOT NULL,
"numero" INTEGER NOT NULL,
"debut" DATE NOT NULL,
"fin" DATE, "texte_id" VARCHAR(20) NOT NULL,
"version_texte_id" INTEGER,
FOREIGN KEY ("cid_id") REFERENCES "section" ("cid"),
FOREIGN KEY ("id_parent_id") REFERENCES "version_section" ("id"),
FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"),
FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id")
);
CREATE INDEX "version_section_cid_id" ON "version_section" ("cid_id");
CREATE INDEX "version_section_id_parent_id" ON "version_section" ("id_parent_id");
CREATE INDEX "version_section_texte_id" ON "version_section" ("texte_id");
CREATE INDEX "version_section_version_texte_id" ON "version_section" ("version_texte_id");
</syntaxhighlight>
; article
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "article" (
"id" VARCHAR(20) NOT NULL PRIMARY KEY,
"nom" VARCHAR(200) NOT NULL,
"etat_juridique" VARCHAR(25) NOT NULL,
"num" VARCHAR(200) NOT NULL,
"debut" DATE NOT NULL,
"fin" DATE,
"texte_id" VARCHAR(20) NOT NULL,
"version_section_id" VARCHAR(20) NOT NULL,
"version_texte_id" INTEGER NOT NULL,
FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"),
FOREIGN KEY ("version_section_id") REFERENCES "version_section" ("id"),
FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id")
);
CREATE INDEX "article_texte_id" ON "article" ("texte_id");
CREATE INDEX "article_version_section_id" ON "article" ("version_section_id");
CREATE INDEX "article_version_texte_id" ON "article" ("version_texte_id");
</syntaxhighlight>
== Schéma 2.0 ==
[[Fichier:BDD Archéo Lex 2.0.svg|center]]
[[Catégorie:Archéo Lex]]
3a6d94102af6230fad3d698954267ceae72b4049
52
51
2014-12-23T13:49:35Z
Seb35
1
/* Schéma 2.0 */ Explication du design de cette version de la base de données
wikitext
text/x-wiki
Archéo Lex importe les codes de la base LEGI dans un base de données SQLite. Cette base de données SQLite permet d’avoir de pouvoir requêter facilement afin de créer les textes de loi dans les formats demandés, ainsi que de pouvoir recréer des textes déjà compilés (''reproductible data''), sous réserve d’avoir encore les textes des articles dans leur version d’alors puisqu’ils ne sont pas enregistrés pour des questions de place.
== Structure ==
La base de données comprend deux types d’informations :
# la base LEGI en tant que donnée brute importée : tables <tt>texte</tt>, <tt>section</tt>, <tt>article</tt> avec diverses métadonnées ;
# les versions consolidées des codes tels que calculés par le programme, puisque cette information n’est pas donnée explicitement dans la base LEGI (il faut rassembler toutes les dates de consolidation mentionnées pour obtenir l’ensemble des versions consolidées) : tables <tt>version_texte</tt>, <tt>version_section</tt>.
De plus, pour permettre de modifier de façon incrémentale les dépôts Git en sortie au fur et à mesure de la mise à jour de la base LEGI, chaque enregistrement dans la base de données est également étiqueté avec la date de la dernière mise à jour du code dans la base LEGI <span style="color:red">[il faut ajouter ces tags dans la BDD]</span>. Ainsi, lorsqu’une section est mise à jour dans la base LEGI, un enregistrement dans <tt>version_section</tt> est créé <u>ainsi qu’un nouveau lien entre <tt>article</tt> et <tt>version_section</tt></u> <span style="color:red">[il faut ajouter une table version_section_article ou version_article]</span>. De même, lorsqu’un article est mis à jour dans la base LEGI, un enregistrement dans <tt>article</tt> <span style="color:red">[ou version_article]</span> ainsi qu’un lien <span style="color:red">[même remarque que précédemment]</span>.
== Schéma SQL 1.0 ==
[[Fichier:BDD Archéo Lex 1.0.svg|center]]
; texte
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "texte" (
"cid" VARCHAR(20) NOT NULL PRIMARY KEY,
"nor" VARCHAR(20) NOT NULL,
"nature" VARCHAR(20) NOT NULL,
"date_texte" DATE,
"date_publi" DATE
);
</syntaxhighlight>
; version_texte
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "version_texte" (
"id" INTEGER NOT NULL PRIMARY KEY,
"texte_id" VARCHAR(20) NOT NULL,
"titre" VARCHAR(200) NOT NULL,
"titre_long" VARCHAR(200) NOT NULL,
"etat_juridique" VARCHAR(25) NOT NULL,
"debut" DATE,
"fin" DATE,
"base_id" INTEGER,
FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"),
FOREIGN KEY ("base_id") REFERENCES "version_texte" ("id")
);
CREATE INDEX "version_texte_base_id" ON "version_texte" ("base_id");
CREATE INDEX "version_texte_texte_id" ON "version_texte" ("texte_id");
</syntaxhighlight>
; section
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "section" (
"cid" VARCHAR(20) NOT NULL PRIMARY KEY,
"cid_parent_id" VARCHAR(20),
"niveau" INTEGER NOT NULL,
"texte_id" VARCHAR(20) NOT NULL,
FOREIGN KEY ("cid_parent_id") REFERENCES "section" ("cid"),
FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid")
);
CREATE INDEX "section_cid_parent_id" ON "section" ("cid_parent_id");
CREATE INDEX "section_texte_id" ON "section" ("texte_id");
</syntaxhighlight>
; version_section
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "version_section" (
"id" VARCHAR(20) NOT NULL PRIMARY KEY,
"cid_id" VARCHAR(20) NOT NULL,
"id_parent_id" VARCHAR(20),
"nom" VARCHAR(200) NOT NULL,
"etat_juridique" VARCHAR(25) NOT NULL,
"niveau" INTEGER NOT NULL,
"numero" INTEGER NOT NULL,
"debut" DATE NOT NULL,
"fin" DATE, "texte_id" VARCHAR(20) NOT NULL,
"version_texte_id" INTEGER,
FOREIGN KEY ("cid_id") REFERENCES "section" ("cid"),
FOREIGN KEY ("id_parent_id") REFERENCES "version_section" ("id"),
FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"),
FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id")
);
CREATE INDEX "version_section_cid_id" ON "version_section" ("cid_id");
CREATE INDEX "version_section_id_parent_id" ON "version_section" ("id_parent_id");
CREATE INDEX "version_section_texte_id" ON "version_section" ("texte_id");
CREATE INDEX "version_section_version_texte_id" ON "version_section" ("version_texte_id");
</syntaxhighlight>
; article
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "article" (
"id" VARCHAR(20) NOT NULL PRIMARY KEY,
"nom" VARCHAR(200) NOT NULL,
"etat_juridique" VARCHAR(25) NOT NULL,
"num" VARCHAR(200) NOT NULL,
"debut" DATE NOT NULL,
"fin" DATE,
"texte_id" VARCHAR(20) NOT NULL,
"version_section_id" VARCHAR(20) NOT NULL,
"version_texte_id" INTEGER NOT NULL,
FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"),
FOREIGN KEY ("version_section_id") REFERENCES "version_section" ("id"),
FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id")
);
CREATE INDEX "article_texte_id" ON "article" ("texte_id");
CREATE INDEX "article_version_section_id" ON "article" ("version_section_id");
CREATE INDEX "article_version_texte_id" ON "article" ("version_texte_id");
</syntaxhighlight>
== Schéma SQL 2.0 ==
[[Fichier:BDD Archéo Lex 2.0.svg|center]]
Cette version apporte principalement la prise en compte des livraisons, i.e. les mises à jour successives de la base LEGI. La version 1.0 de la base de données ne pouvait pas distinguer les livraisons et il aurait alors été nécessaire de modifier directement les divers enregistrements, ce qui aurait pu corrompu la base de donnée si le programme était arrêté au cours de la mise à jour. Cette version de la base de données voit principalement l’ajout de tables pour ces livraisons, ainsi que diverses modifications mineures améliorant la cohérence.
Il y a donc deux axes d’évolution des versions manipulés par cette base de données :
* l’axe temporel (naturel) : les différentes évolutions du texte au cours du temps, par exemple les modifications d’un texte ou les différentes versions consolidées d’un code ; cet axe existait déjà dans la version 1.0 de la base de données
* l’axe des livraisons : l’introduction de nouvelles versions de textes à la suite de la version la plus récente (évolution normale), réécriture de versions existantes (en cas d’erreur sur un champ, faute de frappe, etc.), ajout ou suppression de versions intermédiaires (en cas d’erreur sur les dates de vigueur)
Les deux axes d’évolution ne sont pas traités de façon identique mais s’inspirent des branches Git. Cela s’illustre par l’exemple suivant :
Axe temporel → T1 T2 T3 T4 T5 T6 T7 T8 ↓ Axe des livraisons
v1.0 v2.0 v3.0 v4.0 v5.0 -- livraison 0 : import initial
\ `v6.1 -- livraison 1 : ajout d’une nouvelle version normale
`v4.2 v5.2 v6.2 v7.2 -- livraison 2 : réécriture à partir de la version 4
`v7.3 v8.3 -- livraison 3 : introduction d’une version intermédiaire
Du fait que les livraisons peuvent ajouter des versions intermédiaires sur l’axe temporel (cf livraison 2 dans l’exemple), il peut y avoir un décalage entre les numéros d’ordre des versions et leurs dates (cf dans l’exemple v7.2 et v8.3 qui n’ont pas le même numéro d’ordre (7 et 8) mais la même date (T8). En général, lorsqu’on comparera sur l’axe des livraisons, on préférera donc les comparaisons de versions à même date plutôt qu’à même numéro d’ordre.
Les réécritures, introductions ou suppressions de versions intermédiaires peuvent être soit :
* ''normales'' : dans le cas de la manipulation des versions à venir (postérieures à la date de la livraison), lorsqu’une loi introduit une nouvelle version consolidée intermédiaire ; ou
* ''éditoriales'' : dans le cas de la manipulation des versions passées (antérieures à la date de la livraison), lorsqu’une erreur est corrigée ou que les dates de vigueur sont modifiées
Cette version de la base de données ne distingue pas ces deux types de réécriture, mais cela sera probablement ajouté dans la version 3.0 de la base de données.
Modifications de la base de données par rapport à la version 1.0 :
* Ajouts, suppressions et modifications de tables :
** Ajout de la table <tt>livraison</tt> contenant les dates des livraisons, leur type ("fondation" (=dump complet) ou "miseajour" (=dump incrémental)) et un lien vers la livraison fondation le cas échéant
** Ajout de la table <tt>livraison_texte</tt> mettant en correspondance les textes, livraisons et versions de texte
** Ajout des tables <tt>liste_sections</tt> et <tt>liste_articles</tt> listant les sections et articles inclus dans une version de texte ; ce lien était auparavant fait directement dans <tt>version_section</tt> et <tt>article</tt>
** Retrait de la table <tt>section</tt>, inutilisée et inutile
** Renommage de la table <tt>article</tt> en <tt>version_article</tt> pour cohérence, puisque son rôle est identique à <tt>version_section</tt>
* Transferts de colonnes entre tables :
** De <tt>texte</tt> à <tt>version_texte</tt> : <tt>nature</tt>, <tt>date_texte</tt>, <tt>date_publi</tt> : pour permettre la modification de ces champs d’une livraison à l’autre
* Suppressions de colonnes :
** <tt>version_section</tt>/<tt>cid_id</tt> : car suppression de la table <tt>section</tt>
** <tt>version_section</tt>/<tt>version_texte_id</tt> et <tt>version_article</tt>/<tt>version_texte_id</tt> : il faut désormais passer par <tt>liste_sections</tt> et <tt>liste_articles</tt>
* Renommage de colonnes :
** <tt>debut</tt> et <tt>fin</tt> renommés en <tt>vigueur_debut</tt> et <tt>vigueur_fin</tt> : plus explicite étant donné que de multiples dates sont indiquées et manipulées
** dans <tt>version_article</tt>, <tt>num</tt> en <tt>numero</tt> : plus explicite et cohérence avec <tt>version_section</tt>
* Ajout de colonnes :
** <tt>version_texte</tt>/<tt>date_modif</tt> : date de dernière modification indiquée dans la base LEGI
* Modifications de colonnes :
** dans <tt>version_texte</tt>, la colonne <tt>base_id</tt> (référent à la première version d’un texte sur l’axe temporel) est modifiée en <tt>version_prec_id</tt> (référent à la version précédente sur l’axe temporel)
[[Catégorie:Archéo Lex]]
1e2e33baf094d4f24691c75f56b5069370c2c57d
53
52
2014-12-23T17:52:56Z
Seb35
1
/* Schéma SQL 2.0 */ +opérations classiques
wikitext
text/x-wiki
Archéo Lex importe les codes de la base LEGI dans un base de données SQLite. Cette base de données SQLite permet d’avoir de pouvoir requêter facilement afin de créer les textes de loi dans les formats demandés, ainsi que de pouvoir recréer des textes déjà compilés (''reproductible data''), sous réserve d’avoir encore les textes des articles dans leur version d’alors puisqu’ils ne sont pas enregistrés pour des questions de place.
== Structure ==
La base de données comprend deux types d’informations :
# la base LEGI en tant que donnée brute importée : tables <tt>texte</tt>, <tt>section</tt>, <tt>article</tt> avec diverses métadonnées ;
# les versions consolidées des codes tels que calculés par le programme, puisque cette information n’est pas donnée explicitement dans la base LEGI (il faut rassembler toutes les dates de consolidation mentionnées pour obtenir l’ensemble des versions consolidées) : tables <tt>version_texte</tt>, <tt>version_section</tt>.
De plus, pour permettre de modifier de façon incrémentale les dépôts Git en sortie au fur et à mesure de la mise à jour de la base LEGI, chaque enregistrement dans la base de données est également étiqueté avec la date de la dernière mise à jour du code dans la base LEGI <span style="color:red">[il faut ajouter ces tags dans la BDD]</span>. Ainsi, lorsqu’une section est mise à jour dans la base LEGI, un enregistrement dans <tt>version_section</tt> est créé <u>ainsi qu’un nouveau lien entre <tt>article</tt> et <tt>version_section</tt></u> <span style="color:red">[il faut ajouter une table version_section_article ou version_article]</span>. De même, lorsqu’un article est mis à jour dans la base LEGI, un enregistrement dans <tt>article</tt> <span style="color:red">[ou version_article]</span> ainsi qu’un lien <span style="color:red">[même remarque que précédemment]</span>.
== Schéma SQL 1.0 ==
[[Fichier:BDD Archéo Lex 1.0.svg|center]]
; texte
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "texte" (
"cid" VARCHAR(20) NOT NULL PRIMARY KEY,
"nor" VARCHAR(20) NOT NULL,
"nature" VARCHAR(20) NOT NULL,
"date_texte" DATE,
"date_publi" DATE
);
</syntaxhighlight>
; version_texte
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "version_texte" (
"id" INTEGER NOT NULL PRIMARY KEY,
"texte_id" VARCHAR(20) NOT NULL,
"titre" VARCHAR(200) NOT NULL,
"titre_long" VARCHAR(200) NOT NULL,
"etat_juridique" VARCHAR(25) NOT NULL,
"debut" DATE,
"fin" DATE,
"base_id" INTEGER,
FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"),
FOREIGN KEY ("base_id") REFERENCES "version_texte" ("id")
);
CREATE INDEX "version_texte_base_id" ON "version_texte" ("base_id");
CREATE INDEX "version_texte_texte_id" ON "version_texte" ("texte_id");
</syntaxhighlight>
; section
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "section" (
"cid" VARCHAR(20) NOT NULL PRIMARY KEY,
"cid_parent_id" VARCHAR(20),
"niveau" INTEGER NOT NULL,
"texte_id" VARCHAR(20) NOT NULL,
FOREIGN KEY ("cid_parent_id") REFERENCES "section" ("cid"),
FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid")
);
CREATE INDEX "section_cid_parent_id" ON "section" ("cid_parent_id");
CREATE INDEX "section_texte_id" ON "section" ("texte_id");
</syntaxhighlight>
; version_section
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "version_section" (
"id" VARCHAR(20) NOT NULL PRIMARY KEY,
"cid_id" VARCHAR(20) NOT NULL,
"id_parent_id" VARCHAR(20),
"nom" VARCHAR(200) NOT NULL,
"etat_juridique" VARCHAR(25) NOT NULL,
"niveau" INTEGER NOT NULL,
"numero" INTEGER NOT NULL,
"debut" DATE NOT NULL,
"fin" DATE, "texte_id" VARCHAR(20) NOT NULL,
"version_texte_id" INTEGER,
FOREIGN KEY ("cid_id") REFERENCES "section" ("cid"),
FOREIGN KEY ("id_parent_id") REFERENCES "version_section" ("id"),
FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"),
FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id")
);
CREATE INDEX "version_section_cid_id" ON "version_section" ("cid_id");
CREATE INDEX "version_section_id_parent_id" ON "version_section" ("id_parent_id");
CREATE INDEX "version_section_texte_id" ON "version_section" ("texte_id");
CREATE INDEX "version_section_version_texte_id" ON "version_section" ("version_texte_id");
</syntaxhighlight>
; article
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "article" (
"id" VARCHAR(20) NOT NULL PRIMARY KEY,
"nom" VARCHAR(200) NOT NULL,
"etat_juridique" VARCHAR(25) NOT NULL,
"num" VARCHAR(200) NOT NULL,
"debut" DATE NOT NULL,
"fin" DATE,
"texte_id" VARCHAR(20) NOT NULL,
"version_section_id" VARCHAR(20) NOT NULL,
"version_texte_id" INTEGER NOT NULL,
FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"),
FOREIGN KEY ("version_section_id") REFERENCES "version_section" ("id"),
FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id")
);
CREATE INDEX "article_texte_id" ON "article" ("texte_id");
CREATE INDEX "article_version_section_id" ON "article" ("version_section_id");
CREATE INDEX "article_version_texte_id" ON "article" ("version_texte_id");
</syntaxhighlight>
== Schéma SQL 2.0 ==
=== Graphique ===
[[Fichier:BDD Archéo Lex 2.0.svg|center]]
=== Aperçu général ===
Cette version apporte principalement la prise en compte des livraisons, i.e. les mises à jour successives de la base LEGI. La version 1.0 de la base de données ne pouvait pas distinguer les livraisons et il aurait alors été nécessaire de modifier directement les divers enregistrements, ce qui aurait pu corrompu la base de donnée si le programme était arrêté au cours de la mise à jour. Cette version de la base de données voit principalement l’ajout de tables pour ces livraisons, ainsi que diverses modifications mineures améliorant la cohérence.
Il y a donc deux axes d’évolution des versions manipulés par cette base de données :
* l’axe temporel (naturel) : les différentes évolutions du texte au cours du temps, par exemple les modifications d’un texte ou les différentes versions consolidées d’un code ; cet axe existait déjà dans la version 1.0 de la base de données
* l’axe des livraisons : l’introduction de nouvelles versions de textes à la suite de la version la plus récente (évolution normale), réécriture de versions existantes (en cas d’erreur sur un champ, faute de frappe, etc.), ajout ou suppression de versions intermédiaires (en cas d’erreur sur les dates de vigueur)
Les deux axes d’évolution ne sont pas traités de façon identique mais s’inspirent des branches Git. Cela s’illustre par l’exemple suivant :
Axe temporel → T1 T2 T3 T4 T5 T6 T7 T8 ↓ Axe des livraisons
v1.0 v2.0 v3.0 v4.0 v5.0 -- livraison 0 : import initial
\ `v6.1 -- livraison 1 : ajout d’une nouvelle version normale
`v4.2 v5.2 v6.2 v7.2 -- livraison 2 : réécriture à partir de la version 4
`v7.3 v8.3 -- livraison 3 : introduction d’une version intermédiaire
Du fait que les livraisons peuvent ajouter des versions intermédiaires sur l’axe temporel (cf livraison 2 dans l’exemple), il peut y avoir un décalage entre les numéros d’ordre des versions et leurs dates (cf dans l’exemple v7.2 et v8.3 qui n’ont pas le même numéro d’ordre (7 et 8) mais la même date (T8). En général, lorsqu’on comparera sur l’axe des livraisons, on préférera donc les comparaisons de versions à même date plutôt qu’à même numéro d’ordre.
Les réécritures, introductions ou suppressions de versions intermédiaires peuvent être soit :
* ''normales'' : dans le cas de la manipulation des versions à venir (postérieures à la date de la livraison), lorsqu’une loi introduit une nouvelle version consolidée intermédiaire ; ou
* ''éditoriales'' : dans le cas de la manipulation des versions passées (antérieures à la date de la livraison), lorsqu’une erreur est corrigée ou que les dates de vigueur sont modifiées
Cette version de la base de données ne distingue pas ces deux types de réécriture, mais cela sera probablement ajouté dans la version 3.0 de la base de données.
=== Notes de modification ===
Modifications de la base de données par rapport à la version 1.0 :
* Ajouts, suppressions et modifications de tables :
** Ajout de la table <tt>livraison</tt> contenant les dates des livraisons, leur type ("fondation" (=dump complet) ou "miseajour" (=dump incrémental)) et un lien vers la livraison fondation le cas échéant
** Ajout de la table <tt>livraison_texte</tt> mettant en correspondance les textes, livraisons et versions de texte
** Ajout des tables <tt>liste_sections</tt> et <tt>liste_articles</tt> listant les sections et articles inclus dans une version de texte ; ce lien était auparavant fait directement dans <tt>version_section</tt> et <tt>article</tt>
** Retrait de la table <tt>section</tt>, inutilisée et inutile
** Renommage de la table <tt>article</tt> en <tt>version_article</tt> pour cohérence, puisque son rôle est identique à <tt>version_section</tt>
* Transferts de colonnes entre tables :
** De <tt>texte</tt> à <tt>version_texte</tt> : <tt>nature</tt>, <tt>date_texte</tt>, <tt>date_publi</tt> : pour permettre la modification de ces champs d’une livraison à l’autre
* Suppressions de colonnes :
** <tt>version_section</tt>/<tt>cid_id</tt> : car suppression de la table <tt>section</tt>
** <tt>version_section</tt>/<tt>version_texte_id</tt> et <tt>version_article</tt>/<tt>version_texte_id</tt> : il faut désormais passer par <tt>liste_sections</tt> et <tt>liste_articles</tt>
* Renommage de colonnes :
** <tt>debut</tt> et <tt>fin</tt> renommés en <tt>vigueur_debut</tt> et <tt>vigueur_fin</tt> : plus explicite étant donné que de multiples dates sont indiquées et manipulées
** dans <tt>version_article</tt>, <tt>num</tt> en <tt>numero</tt> : plus explicite et cohérence avec <tt>version_section</tt>
* Ajout de colonnes :
** <tt>version_texte</tt>/<tt>date_modif</tt> : date de dernière modification indiquée dans la base LEGI
* Modifications de colonnes :
** dans <tt>version_texte</tt>, la colonne <tt>base_id</tt> (référent à la première version d’un texte sur l’axe temporel) est modifiée en <tt>version_prec_id</tt> (référent à la version précédente sur l’axe temporel)
=== Opérations classiques ===
Les opérations classiques et prévues sur la base de données sont :
* Création ''ex nihilo'' de la base de données :
*# Insertion d’une ligne dans la table <tt>livraison</tt>
*# Insertion d’une ou plusieurs lignes dans la table <tt>texte</tt>
*# Calcul des versions de texte et insertion de celles-ci dans les tables <tt>version_{texte,section,article}</tt>
*# Insertion des lignes adéquates dans les tables <tt>livraison_texte</tt> et <tt>liste_{sections,articles}</tt>
* Mise à jour après une mise à jour incrémentale de la base LEGI : similaire au point précédent en n’ajoutant que les versions de textes, sections et articles nécessaires et en faisant les liens adéquats dans les tables livraison
* Mise à jour après un dump complet de la base LEGI : similaire aux premier et deuxième points en n’ajoutant que ce qui n’existe pas
* Requêter toutes les versions temporelles correspondant à une livraison :
*# Requête sur la table <tt>livraison_texte</tt> pour obtenir toutes les versions temporelles d’un texte
*# Requête sur la table <tt>version_texte</tt> pour obtenir les métadonnées sur les versions temporelles
*# Requête sur les tables <tt>liste_{sections,articles}</tt> pour obtenir les sections et articles
*# Requête sur les tables <tt>version_{sections,articles}</tt> pour obtenir les métadonnées et données sur les sections et articles
* Requêter les versions temporelles à une date donnée pour toutes les livraisons :
*# Requête sur la table <tt>version_texte</tt> en fixant le champ <tt>vigueur_debut</tt> (on peut aussi fixer <tt>vigueur_fin</tt> si on préfère ou même un intervalle temporel puisque la date est directement gérée par SQL)
*# Requête sur la table <tt>livraison_texte</tt> pour obtenir toutes les livraisons correspondantes à ces versions, si on veut
*# Requête sur les tables <tt>liste_{sections,articles}</tt> pour obtenir les sections et articles
*# Requête sur les tables <tt>version_{sections,articles}</tt> pour obtenir les métadonnées et données sur les sections et articles
Noter que pour la modification, l’ajout ou la suppression d’une section, il faut créer l’enregistrement dans <tt>version_section</tt>, puis créer des enregistrements de <tt>version_section</tt> pour toutes les sections enfants ainsi que les articles enfants, et ceci même si ceux-ci n’ont pas été changés. Cela est requis à cause du lien <tt>id_parent_id</tt> qui doit correspondre au nouveau élément. Je ne vois pas vraiment comment éviter cela, à part en créant une liste de sections ''alias'', c’est-à-dire que si une section enfant a un <tt>id_parent_id</tt> qui n’existe pas dans la <tt>liste_sections</tt> de cette version de texte, on cherchera le bon id de section dans une table <tt>alias_section</tt> (dans ce cas, ça serait juste pour les sections, pas pour les articles).
=== Design et évolutions futures ===
[[Catégorie:Archéo Lex]]
690c04c3ec0c99631202309d731cf6b4513d8c29
54
53
2014-12-23T18:00:37Z
Seb35
1
/* Aperçu général */ précision
wikitext
text/x-wiki
Archéo Lex importe les codes de la base LEGI dans un base de données SQLite. Cette base de données SQLite permet d’avoir de pouvoir requêter facilement afin de créer les textes de loi dans les formats demandés, ainsi que de pouvoir recréer des textes déjà compilés (''reproductible data''), sous réserve d’avoir encore les textes des articles dans leur version d’alors puisqu’ils ne sont pas enregistrés pour des questions de place.
== Structure ==
La base de données comprend deux types d’informations :
# la base LEGI en tant que donnée brute importée : tables <tt>texte</tt>, <tt>section</tt>, <tt>article</tt> avec diverses métadonnées ;
# les versions consolidées des codes tels que calculés par le programme, puisque cette information n’est pas donnée explicitement dans la base LEGI (il faut rassembler toutes les dates de consolidation mentionnées pour obtenir l’ensemble des versions consolidées) : tables <tt>version_texte</tt>, <tt>version_section</tt>.
De plus, pour permettre de modifier de façon incrémentale les dépôts Git en sortie au fur et à mesure de la mise à jour de la base LEGI, chaque enregistrement dans la base de données est également étiqueté avec la date de la dernière mise à jour du code dans la base LEGI <span style="color:red">[il faut ajouter ces tags dans la BDD]</span>. Ainsi, lorsqu’une section est mise à jour dans la base LEGI, un enregistrement dans <tt>version_section</tt> est créé <u>ainsi qu’un nouveau lien entre <tt>article</tt> et <tt>version_section</tt></u> <span style="color:red">[il faut ajouter une table version_section_article ou version_article]</span>. De même, lorsqu’un article est mis à jour dans la base LEGI, un enregistrement dans <tt>article</tt> <span style="color:red">[ou version_article]</span> ainsi qu’un lien <span style="color:red">[même remarque que précédemment]</span>.
== Schéma SQL 1.0 ==
[[Fichier:BDD Archéo Lex 1.0.svg|center]]
; texte
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "texte" (
"cid" VARCHAR(20) NOT NULL PRIMARY KEY,
"nor" VARCHAR(20) NOT NULL,
"nature" VARCHAR(20) NOT NULL,
"date_texte" DATE,
"date_publi" DATE
);
</syntaxhighlight>
; version_texte
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "version_texte" (
"id" INTEGER NOT NULL PRIMARY KEY,
"texte_id" VARCHAR(20) NOT NULL,
"titre" VARCHAR(200) NOT NULL,
"titre_long" VARCHAR(200) NOT NULL,
"etat_juridique" VARCHAR(25) NOT NULL,
"debut" DATE,
"fin" DATE,
"base_id" INTEGER,
FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"),
FOREIGN KEY ("base_id") REFERENCES "version_texte" ("id")
);
CREATE INDEX "version_texte_base_id" ON "version_texte" ("base_id");
CREATE INDEX "version_texte_texte_id" ON "version_texte" ("texte_id");
</syntaxhighlight>
; section
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "section" (
"cid" VARCHAR(20) NOT NULL PRIMARY KEY,
"cid_parent_id" VARCHAR(20),
"niveau" INTEGER NOT NULL,
"texte_id" VARCHAR(20) NOT NULL,
FOREIGN KEY ("cid_parent_id") REFERENCES "section" ("cid"),
FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid")
);
CREATE INDEX "section_cid_parent_id" ON "section" ("cid_parent_id");
CREATE INDEX "section_texte_id" ON "section" ("texte_id");
</syntaxhighlight>
; version_section
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "version_section" (
"id" VARCHAR(20) NOT NULL PRIMARY KEY,
"cid_id" VARCHAR(20) NOT NULL,
"id_parent_id" VARCHAR(20),
"nom" VARCHAR(200) NOT NULL,
"etat_juridique" VARCHAR(25) NOT NULL,
"niveau" INTEGER NOT NULL,
"numero" INTEGER NOT NULL,
"debut" DATE NOT NULL,
"fin" DATE, "texte_id" VARCHAR(20) NOT NULL,
"version_texte_id" INTEGER,
FOREIGN KEY ("cid_id") REFERENCES "section" ("cid"),
FOREIGN KEY ("id_parent_id") REFERENCES "version_section" ("id"),
FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"),
FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id")
);
CREATE INDEX "version_section_cid_id" ON "version_section" ("cid_id");
CREATE INDEX "version_section_id_parent_id" ON "version_section" ("id_parent_id");
CREATE INDEX "version_section_texte_id" ON "version_section" ("texte_id");
CREATE INDEX "version_section_version_texte_id" ON "version_section" ("version_texte_id");
</syntaxhighlight>
; article
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "article" (
"id" VARCHAR(20) NOT NULL PRIMARY KEY,
"nom" VARCHAR(200) NOT NULL,
"etat_juridique" VARCHAR(25) NOT NULL,
"num" VARCHAR(200) NOT NULL,
"debut" DATE NOT NULL,
"fin" DATE,
"texte_id" VARCHAR(20) NOT NULL,
"version_section_id" VARCHAR(20) NOT NULL,
"version_texte_id" INTEGER NOT NULL,
FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"),
FOREIGN KEY ("version_section_id") REFERENCES "version_section" ("id"),
FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id")
);
CREATE INDEX "article_texte_id" ON "article" ("texte_id");
CREATE INDEX "article_version_section_id" ON "article" ("version_section_id");
CREATE INDEX "article_version_texte_id" ON "article" ("version_texte_id");
</syntaxhighlight>
== Schéma SQL 2.0 ==
=== Graphique ===
[[Fichier:BDD Archéo Lex 2.0.svg|center]]
=== Aperçu général ===
Cette version apporte principalement la prise en compte des livraisons, i.e. les mises à jour successives de la base LEGI. La version 1.0 de la base de données ne pouvait pas distinguer les livraisons et il aurait alors été nécessaire de modifier directement les divers enregistrements, ce qui aurait pu corrompu la base de donnée si le programme était arrêté au cours de la mise à jour. Cette version de la base de données voit principalement l’ajout de tables pour ces livraisons, ainsi que diverses modifications mineures améliorant la cohérence.
Il y a donc deux axes d’évolution des versions manipulés par cette base de données :
* l’axe temporel (naturel) : les différentes évolutions du texte au cours du temps, par exemple les modifications d’un texte ou les différentes versions consolidées d’un code ; cet axe existait déjà dans la version 1.0 de la base de données et s’appuie entièrement sur les <u>dates de vigueur</u>
* l’axe des livraisons : au fur et à mesure des livraisons (<u>tables livraison</u>) : introduction de nouvelles versions de textes à la suite de la version la plus récente (évolution normale), réécriture de versions existantes (en cas d’erreur sur un champ, faute de frappe, etc.), ajout ou suppression de versions intermédiaires (en cas d’erreur sur les dates de vigueur)
Les deux axes d’évolution ne sont pas traités de façon identique mais s’inspirent des branches Git. Cela s’illustre par l’exemple suivant :
Axe temporel → T1 T2 T3 T4 T5 T6 T7 T8 ↓ Axe des livraisons
v1.0 v2.0 v3.0 v4.0 v5.0 -- livraison 0 : import initial
\ `v6.1 -- livraison 1 : ajout d’une nouvelle version normale
`v4.2 v5.2 v6.2 v7.2 -- livraison 2 : réécriture à partir de la version 4
`v7.3 v8.3 -- livraison 3 : introduction d’une version intermédiaire
Du fait que les livraisons peuvent ajouter des versions intermédiaires sur l’axe temporel (cf livraison 2 dans l’exemple), il peut y avoir un décalage entre les numéros d’ordre des versions et leurs dates (cf dans l’exemple v7.2 et v8.3 qui n’ont pas le même numéro d’ordre (7 et 8) mais la même date (T8). En général, lorsqu’on comparera sur l’axe des livraisons, on préférera donc les comparaisons de versions à même date plutôt qu’à même numéro d’ordre.
Les réécritures, introductions ou suppressions de versions intermédiaires peuvent être soit :
* ''normales'' : dans le cas de la manipulation des versions à venir (postérieures à la date de la livraison), lorsqu’une loi introduit une nouvelle version consolidée intermédiaire ; ou
* ''éditoriales'' : dans le cas de la manipulation des versions passées (antérieures à la date de la livraison), lorsqu’une erreur est corrigée ou que les dates de vigueur sont modifiées
Cette version de la base de données ne distingue pas ces deux types de réécriture, mais cela sera probablement ajouté dans la version 3.0 de la base de données.
=== Notes de modification ===
Modifications de la base de données par rapport à la version 1.0 :
* Ajouts, suppressions et modifications de tables :
** Ajout de la table <tt>livraison</tt> contenant les dates des livraisons, leur type ("fondation" (=dump complet) ou "miseajour" (=dump incrémental)) et un lien vers la livraison fondation le cas échéant
** Ajout de la table <tt>livraison_texte</tt> mettant en correspondance les textes, livraisons et versions de texte
** Ajout des tables <tt>liste_sections</tt> et <tt>liste_articles</tt> listant les sections et articles inclus dans une version de texte ; ce lien était auparavant fait directement dans <tt>version_section</tt> et <tt>article</tt>
** Retrait de la table <tt>section</tt>, inutilisée et inutile
** Renommage de la table <tt>article</tt> en <tt>version_article</tt> pour cohérence, puisque son rôle est identique à <tt>version_section</tt>
* Transferts de colonnes entre tables :
** De <tt>texte</tt> à <tt>version_texte</tt> : <tt>nature</tt>, <tt>date_texte</tt>, <tt>date_publi</tt> : pour permettre la modification de ces champs d’une livraison à l’autre
* Suppressions de colonnes :
** <tt>version_section</tt>/<tt>cid_id</tt> : car suppression de la table <tt>section</tt>
** <tt>version_section</tt>/<tt>version_texte_id</tt> et <tt>version_article</tt>/<tt>version_texte_id</tt> : il faut désormais passer par <tt>liste_sections</tt> et <tt>liste_articles</tt>
* Renommage de colonnes :
** <tt>debut</tt> et <tt>fin</tt> renommés en <tt>vigueur_debut</tt> et <tt>vigueur_fin</tt> : plus explicite étant donné que de multiples dates sont indiquées et manipulées
** dans <tt>version_article</tt>, <tt>num</tt> en <tt>numero</tt> : plus explicite et cohérence avec <tt>version_section</tt>
* Ajout de colonnes :
** <tt>version_texte</tt>/<tt>date_modif</tt> : date de dernière modification indiquée dans la base LEGI
* Modifications de colonnes :
** dans <tt>version_texte</tt>, la colonne <tt>base_id</tt> (référent à la première version d’un texte sur l’axe temporel) est modifiée en <tt>version_prec_id</tt> (référent à la version précédente sur l’axe temporel)
=== Opérations classiques ===
Les opérations classiques et prévues sur la base de données sont :
* Création ''ex nihilo'' de la base de données :
*# Insertion d’une ligne dans la table <tt>livraison</tt>
*# Insertion d’une ou plusieurs lignes dans la table <tt>texte</tt>
*# Calcul des versions de texte et insertion de celles-ci dans les tables <tt>version_{texte,section,article}</tt>
*# Insertion des lignes adéquates dans les tables <tt>livraison_texte</tt> et <tt>liste_{sections,articles}</tt>
* Mise à jour après une mise à jour incrémentale de la base LEGI : similaire au point précédent en n’ajoutant que les versions de textes, sections et articles nécessaires et en faisant les liens adéquats dans les tables livraison
* Mise à jour après un dump complet de la base LEGI : similaire aux premier et deuxième points en n’ajoutant que ce qui n’existe pas
* Requêter toutes les versions temporelles correspondant à une livraison :
*# Requête sur la table <tt>livraison_texte</tt> pour obtenir toutes les versions temporelles d’un texte
*# Requête sur la table <tt>version_texte</tt> pour obtenir les métadonnées sur les versions temporelles
*# Requête sur les tables <tt>liste_{sections,articles}</tt> pour obtenir les sections et articles
*# Requête sur les tables <tt>version_{sections,articles}</tt> pour obtenir les métadonnées et données sur les sections et articles
* Requêter les versions temporelles à une date donnée pour toutes les livraisons :
*# Requête sur la table <tt>version_texte</tt> en fixant le champ <tt>vigueur_debut</tt> (on peut aussi fixer <tt>vigueur_fin</tt> si on préfère ou même un intervalle temporel puisque la date est directement gérée par SQL)
*# Requête sur la table <tt>livraison_texte</tt> pour obtenir toutes les livraisons correspondantes à ces versions, si on veut
*# Requête sur les tables <tt>liste_{sections,articles}</tt> pour obtenir les sections et articles
*# Requête sur les tables <tt>version_{sections,articles}</tt> pour obtenir les métadonnées et données sur les sections et articles
Noter que pour la modification, l’ajout ou la suppression d’une section, il faut créer l’enregistrement dans <tt>version_section</tt>, puis créer des enregistrements de <tt>version_section</tt> pour toutes les sections enfants ainsi que les articles enfants, et ceci même si ceux-ci n’ont pas été changés. Cela est requis à cause du lien <tt>id_parent_id</tt> qui doit correspondre au nouveau élément. Je ne vois pas vraiment comment éviter cela, à part en créant une liste de sections ''alias'', c’est-à-dire que si une section enfant a un <tt>id_parent_id</tt> qui n’existe pas dans la <tt>liste_sections</tt> de cette version de texte, on cherchera le bon id de section dans une table <tt>alias_section</tt> (dans ce cas, ça serait juste pour les sections, pas pour les articles).
=== Design et évolutions futures ===
[[Catégorie:Archéo Lex]]
58f98a34b580535f28da57f4f0e28eaf72d62a41
66
54
2014-12-28T21:05:07Z
Seb35
1
déplacé vers github
wikitext
text/x-wiki
<div align="center"><div style="background-color:#aeff00;border:2px solid #54ff00;opacity:0.8;padding:5px;display:inline-block;">Déplacé sur https://github.com/Seb35/Archeo-Lex/wiki/Base_de_données</div></div>
Archéo Lex importe les codes de la base LEGI dans un base de données SQLite. Cette base de données SQLite permet d’avoir de pouvoir requêter facilement afin de créer les textes de loi dans les formats demandés, ainsi que de pouvoir recréer des textes déjà compilés (''reproductible data''), sous réserve d’avoir encore les textes des articles dans leur version d’alors puisqu’ils ne sont pas enregistrés pour des questions de place.
== Structure ==
La base de données comprend deux types d’informations :
# la base LEGI en tant que donnée brute importée : tables <tt>texte</tt>, <tt>section</tt>, <tt>article</tt> avec diverses métadonnées ;
# les versions consolidées des codes tels que calculés par le programme, puisque cette information n’est pas donnée explicitement dans la base LEGI (il faut rassembler toutes les dates de consolidation mentionnées pour obtenir l’ensemble des versions consolidées) : tables <tt>version_texte</tt>, <tt>version_section</tt>.
De plus, pour permettre de modifier de façon incrémentale les dépôts Git en sortie au fur et à mesure de la mise à jour de la base LEGI, chaque enregistrement dans la base de données est également étiqueté avec la date de la dernière mise à jour du code dans la base LEGI <span style="color:red">[il faut ajouter ces tags dans la BDD]</span>. Ainsi, lorsqu’une section est mise à jour dans la base LEGI, un enregistrement dans <tt>version_section</tt> est créé <u>ainsi qu’un nouveau lien entre <tt>article</tt> et <tt>version_section</tt></u> <span style="color:red">[il faut ajouter une table version_section_article ou version_article]</span>. De même, lorsqu’un article est mis à jour dans la base LEGI, un enregistrement dans <tt>article</tt> <span style="color:red">[ou version_article]</span> ainsi qu’un lien <span style="color:red">[même remarque que précédemment]</span>.
== Schéma SQL 1.0 ==
[[Fichier:BDD Archéo Lex 1.0.svg|center]]
; texte
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "texte" (
"cid" VARCHAR(20) NOT NULL PRIMARY KEY,
"nor" VARCHAR(20) NOT NULL,
"nature" VARCHAR(20) NOT NULL,
"date_texte" DATE,
"date_publi" DATE
);
</syntaxhighlight>
; version_texte
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "version_texte" (
"id" INTEGER NOT NULL PRIMARY KEY,
"texte_id" VARCHAR(20) NOT NULL,
"titre" VARCHAR(200) NOT NULL,
"titre_long" VARCHAR(200) NOT NULL,
"etat_juridique" VARCHAR(25) NOT NULL,
"debut" DATE,
"fin" DATE,
"base_id" INTEGER,
FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"),
FOREIGN KEY ("base_id") REFERENCES "version_texte" ("id")
);
CREATE INDEX "version_texte_base_id" ON "version_texte" ("base_id");
CREATE INDEX "version_texte_texte_id" ON "version_texte" ("texte_id");
</syntaxhighlight>
; section
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "section" (
"cid" VARCHAR(20) NOT NULL PRIMARY KEY,
"cid_parent_id" VARCHAR(20),
"niveau" INTEGER NOT NULL,
"texte_id" VARCHAR(20) NOT NULL,
FOREIGN KEY ("cid_parent_id") REFERENCES "section" ("cid"),
FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid")
);
CREATE INDEX "section_cid_parent_id" ON "section" ("cid_parent_id");
CREATE INDEX "section_texte_id" ON "section" ("texte_id");
</syntaxhighlight>
; version_section
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "version_section" (
"id" VARCHAR(20) NOT NULL PRIMARY KEY,
"cid_id" VARCHAR(20) NOT NULL,
"id_parent_id" VARCHAR(20),
"nom" VARCHAR(200) NOT NULL,
"etat_juridique" VARCHAR(25) NOT NULL,
"niveau" INTEGER NOT NULL,
"numero" INTEGER NOT NULL,
"debut" DATE NOT NULL,
"fin" DATE, "texte_id" VARCHAR(20) NOT NULL,
"version_texte_id" INTEGER,
FOREIGN KEY ("cid_id") REFERENCES "section" ("cid"),
FOREIGN KEY ("id_parent_id") REFERENCES "version_section" ("id"),
FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"),
FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id")
);
CREATE INDEX "version_section_cid_id" ON "version_section" ("cid_id");
CREATE INDEX "version_section_id_parent_id" ON "version_section" ("id_parent_id");
CREATE INDEX "version_section_texte_id" ON "version_section" ("texte_id");
CREATE INDEX "version_section_version_texte_id" ON "version_section" ("version_texte_id");
</syntaxhighlight>
; article
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "article" (
"id" VARCHAR(20) NOT NULL PRIMARY KEY,
"nom" VARCHAR(200) NOT NULL,
"etat_juridique" VARCHAR(25) NOT NULL,
"num" VARCHAR(200) NOT NULL,
"debut" DATE NOT NULL,
"fin" DATE,
"texte_id" VARCHAR(20) NOT NULL,
"version_section_id" VARCHAR(20) NOT NULL,
"version_texte_id" INTEGER NOT NULL,
FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"),
FOREIGN KEY ("version_section_id") REFERENCES "version_section" ("id"),
FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id")
);
CREATE INDEX "article_texte_id" ON "article" ("texte_id");
CREATE INDEX "article_version_section_id" ON "article" ("version_section_id");
CREATE INDEX "article_version_texte_id" ON "article" ("version_texte_id");
</syntaxhighlight>
== Schéma SQL 2.0 ==
=== Graphique ===
[[Fichier:BDD Archéo Lex 2.0.svg|center]]
=== Aperçu général ===
Cette version apporte principalement la prise en compte des livraisons, i.e. les mises à jour successives de la base LEGI. La version 1.0 de la base de données ne pouvait pas distinguer les livraisons et il aurait alors été nécessaire de modifier directement les divers enregistrements, ce qui aurait pu corrompu la base de donnée si le programme était arrêté au cours de la mise à jour. Cette version de la base de données voit principalement l’ajout de tables pour ces livraisons, ainsi que diverses modifications mineures améliorant la cohérence.
Il y a donc deux axes d’évolution des versions manipulés par cette base de données :
* l’axe temporel (naturel) : les différentes évolutions du texte au cours du temps, par exemple les modifications d’un texte ou les différentes versions consolidées d’un code ; cet axe existait déjà dans la version 1.0 de la base de données et s’appuie entièrement sur les <u>dates de vigueur</u>
* l’axe des livraisons : au fur et à mesure des livraisons (<u>tables livraison</u>) : introduction de nouvelles versions de textes à la suite de la version la plus récente (évolution normale), réécriture de versions existantes (en cas d’erreur sur un champ, faute de frappe, etc.), ajout ou suppression de versions intermédiaires (en cas d’erreur sur les dates de vigueur)
Les deux axes d’évolution ne sont pas traités de façon identique mais s’inspirent des branches Git. Cela s’illustre par l’exemple suivant :
Axe temporel → T1 T2 T3 T4 T5 T6 T7 T8 ↓ Axe des livraisons
v1.0 v2.0 v3.0 v4.0 v5.0 -- livraison 0 : import initial
\ `v6.1 -- livraison 1 : ajout d’une nouvelle version normale
`v4.2 v5.2 v6.2 v7.2 -- livraison 2 : réécriture à partir de la version 4
`v7.3 v8.3 -- livraison 3 : introduction d’une version intermédiaire
Du fait que les livraisons peuvent ajouter des versions intermédiaires sur l’axe temporel (cf livraison 2 dans l’exemple), il peut y avoir un décalage entre les numéros d’ordre des versions et leurs dates (cf dans l’exemple v7.2 et v8.3 qui n’ont pas le même numéro d’ordre (7 et 8) mais la même date (T8). En général, lorsqu’on comparera sur l’axe des livraisons, on préférera donc les comparaisons de versions à même date plutôt qu’à même numéro d’ordre.
Les réécritures, introductions ou suppressions de versions intermédiaires peuvent être soit :
* ''normales'' : dans le cas de la manipulation des versions à venir (postérieures à la date de la livraison), lorsqu’une loi introduit une nouvelle version consolidée intermédiaire ; ou
* ''éditoriales'' : dans le cas de la manipulation des versions passées (antérieures à la date de la livraison), lorsqu’une erreur est corrigée ou que les dates de vigueur sont modifiées
Cette version de la base de données ne distingue pas ces deux types de réécriture, mais cela sera probablement ajouté dans la version 3.0 de la base de données.
=== Notes de modification ===
Modifications de la base de données par rapport à la version 1.0 :
* Ajouts, suppressions et modifications de tables :
** Ajout de la table <tt>livraison</tt> contenant les dates des livraisons, leur type ("fondation" (=dump complet) ou "miseajour" (=dump incrémental)) et un lien vers la livraison fondation le cas échéant
** Ajout de la table <tt>livraison_texte</tt> mettant en correspondance les textes, livraisons et versions de texte
** Ajout des tables <tt>liste_sections</tt> et <tt>liste_articles</tt> listant les sections et articles inclus dans une version de texte ; ce lien était auparavant fait directement dans <tt>version_section</tt> et <tt>article</tt>
** Retrait de la table <tt>section</tt>, inutilisée et inutile
** Renommage de la table <tt>article</tt> en <tt>version_article</tt> pour cohérence, puisque son rôle est identique à <tt>version_section</tt>
* Transferts de colonnes entre tables :
** De <tt>texte</tt> à <tt>version_texte</tt> : <tt>nature</tt>, <tt>date_texte</tt>, <tt>date_publi</tt> : pour permettre la modification de ces champs d’une livraison à l’autre
* Suppressions de colonnes :
** <tt>version_section</tt>/<tt>cid_id</tt> : car suppression de la table <tt>section</tt>
** <tt>version_section</tt>/<tt>version_texte_id</tt> et <tt>version_article</tt>/<tt>version_texte_id</tt> : il faut désormais passer par <tt>liste_sections</tt> et <tt>liste_articles</tt>
* Renommage de colonnes :
** <tt>debut</tt> et <tt>fin</tt> renommés en <tt>vigueur_debut</tt> et <tt>vigueur_fin</tt> : plus explicite étant donné que de multiples dates sont indiquées et manipulées
** dans <tt>version_article</tt>, <tt>num</tt> en <tt>numero</tt> : plus explicite et cohérence avec <tt>version_section</tt>
* Ajout de colonnes :
** <tt>version_texte</tt>/<tt>date_modif</tt> : date de dernière modification indiquée dans la base LEGI
* Modifications de colonnes :
** dans <tt>version_texte</tt>, la colonne <tt>base_id</tt> (référent à la première version d’un texte sur l’axe temporel) est modifiée en <tt>version_prec_id</tt> (référent à la version précédente sur l’axe temporel)
=== Opérations classiques ===
Les opérations classiques et prévues sur la base de données sont :
* Création ''ex nihilo'' de la base de données :
*# Insertion d’une ligne dans la table <tt>livraison</tt>
*# Insertion d’une ou plusieurs lignes dans la table <tt>texte</tt>
*# Calcul des versions de texte et insertion de celles-ci dans les tables <tt>version_{texte,section,article}</tt>
*# Insertion des lignes adéquates dans les tables <tt>livraison_texte</tt> et <tt>liste_{sections,articles}</tt>
* Mise à jour après une mise à jour incrémentale de la base LEGI : similaire au point précédent en n’ajoutant que les versions de textes, sections et articles nécessaires et en faisant les liens adéquats dans les tables livraison
* Mise à jour après un dump complet de la base LEGI : similaire aux premier et deuxième points en n’ajoutant que ce qui n’existe pas
* Requêter toutes les versions temporelles correspondant à une livraison :
*# Requête sur la table <tt>livraison_texte</tt> pour obtenir toutes les versions temporelles d’un texte
*# Requête sur la table <tt>version_texte</tt> pour obtenir les métadonnées sur les versions temporelles
*# Requête sur les tables <tt>liste_{sections,articles}</tt> pour obtenir les sections et articles
*# Requête sur les tables <tt>version_{sections,articles}</tt> pour obtenir les métadonnées et données sur les sections et articles
* Requêter les versions temporelles à une date donnée pour toutes les livraisons :
*# Requête sur la table <tt>version_texte</tt> en fixant le champ <tt>vigueur_debut</tt> (on peut aussi fixer <tt>vigueur_fin</tt> si on préfère ou même un intervalle temporel puisque la date est directement gérée par SQL)
*# Requête sur la table <tt>livraison_texte</tt> pour obtenir toutes les livraisons correspondantes à ces versions, si on veut
*# Requête sur les tables <tt>liste_{sections,articles}</tt> pour obtenir les sections et articles
*# Requête sur les tables <tt>version_{sections,articles}</tt> pour obtenir les métadonnées et données sur les sections et articles
Noter que pour la modification, l’ajout ou la suppression d’une section, il faut créer l’enregistrement dans <tt>version_section</tt>, puis créer des enregistrements de <tt>version_section</tt> pour toutes les sections enfants ainsi que les articles enfants, et ceci même si ceux-ci n’ont pas été changés. Cela est requis à cause du lien <tt>id_parent_id</tt> qui doit correspondre au nouveau élément. Je ne vois pas vraiment comment éviter cela, à part en créant une liste de sections ''alias'', c’est-à-dire que si une section enfant a un <tt>id_parent_id</tt> qui n’existe pas dans la <tt>liste_sections</tt> de cette version de texte, on cherchera le bon id de section dans une table <tt>alias_section</tt> (dans ce cas, ça serait juste pour les sections, pas pour les articles).
=== Design et évolutions futures ===
[[Catégorie:Archéo Lex]]
5bfaa4da2bbb8f924c594f88bc20b7db32d10d2b
89
66
2015-02-11T16:20:39Z
Seb35
1
+modèle Transféré
wikitext
text/x-wiki
{{Transféré|https://github.com/Seb35/Archeo-Lex/wiki/Base_de_données}}
Archéo Lex importe les codes de la base LEGI dans un base de données SQLite. Cette base de données SQLite permet d’avoir de pouvoir requêter facilement afin de créer les textes de loi dans les formats demandés, ainsi que de pouvoir recréer des textes déjà compilés (''reproductible data''), sous réserve d’avoir encore les textes des articles dans leur version d’alors puisqu’ils ne sont pas enregistrés pour des questions de place.
== Structure ==
La base de données comprend deux types d’informations :
# la base LEGI en tant que donnée brute importée : tables <tt>texte</tt>, <tt>section</tt>, <tt>article</tt> avec diverses métadonnées ;
# les versions consolidées des codes tels que calculés par le programme, puisque cette information n’est pas donnée explicitement dans la base LEGI (il faut rassembler toutes les dates de consolidation mentionnées pour obtenir l’ensemble des versions consolidées) : tables <tt>version_texte</tt>, <tt>version_section</tt>.
De plus, pour permettre de modifier de façon incrémentale les dépôts Git en sortie au fur et à mesure de la mise à jour de la base LEGI, chaque enregistrement dans la base de données est également étiqueté avec la date de la dernière mise à jour du code dans la base LEGI <span style="color:red">[il faut ajouter ces tags dans la BDD]</span>. Ainsi, lorsqu’une section est mise à jour dans la base LEGI, un enregistrement dans <tt>version_section</tt> est créé <u>ainsi qu’un nouveau lien entre <tt>article</tt> et <tt>version_section</tt></u> <span style="color:red">[il faut ajouter une table version_section_article ou version_article]</span>. De même, lorsqu’un article est mis à jour dans la base LEGI, un enregistrement dans <tt>article</tt> <span style="color:red">[ou version_article]</span> ainsi qu’un lien <span style="color:red">[même remarque que précédemment]</span>.
== Schéma SQL 1.0 ==
[[Fichier:BDD Archéo Lex 1.0.svg|center]]
; texte
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "texte" (
"cid" VARCHAR(20) NOT NULL PRIMARY KEY,
"nor" VARCHAR(20) NOT NULL,
"nature" VARCHAR(20) NOT NULL,
"date_texte" DATE,
"date_publi" DATE
);
</syntaxhighlight>
; version_texte
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "version_texte" (
"id" INTEGER NOT NULL PRIMARY KEY,
"texte_id" VARCHAR(20) NOT NULL,
"titre" VARCHAR(200) NOT NULL,
"titre_long" VARCHAR(200) NOT NULL,
"etat_juridique" VARCHAR(25) NOT NULL,
"debut" DATE,
"fin" DATE,
"base_id" INTEGER,
FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"),
FOREIGN KEY ("base_id") REFERENCES "version_texte" ("id")
);
CREATE INDEX "version_texte_base_id" ON "version_texte" ("base_id");
CREATE INDEX "version_texte_texte_id" ON "version_texte" ("texte_id");
</syntaxhighlight>
; section
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "section" (
"cid" VARCHAR(20) NOT NULL PRIMARY KEY,
"cid_parent_id" VARCHAR(20),
"niveau" INTEGER NOT NULL,
"texte_id" VARCHAR(20) NOT NULL,
FOREIGN KEY ("cid_parent_id") REFERENCES "section" ("cid"),
FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid")
);
CREATE INDEX "section_cid_parent_id" ON "section" ("cid_parent_id");
CREATE INDEX "section_texte_id" ON "section" ("texte_id");
</syntaxhighlight>
; version_section
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "version_section" (
"id" VARCHAR(20) NOT NULL PRIMARY KEY,
"cid_id" VARCHAR(20) NOT NULL,
"id_parent_id" VARCHAR(20),
"nom" VARCHAR(200) NOT NULL,
"etat_juridique" VARCHAR(25) NOT NULL,
"niveau" INTEGER NOT NULL,
"numero" INTEGER NOT NULL,
"debut" DATE NOT NULL,
"fin" DATE, "texte_id" VARCHAR(20) NOT NULL,
"version_texte_id" INTEGER,
FOREIGN KEY ("cid_id") REFERENCES "section" ("cid"),
FOREIGN KEY ("id_parent_id") REFERENCES "version_section" ("id"),
FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"),
FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id")
);
CREATE INDEX "version_section_cid_id" ON "version_section" ("cid_id");
CREATE INDEX "version_section_id_parent_id" ON "version_section" ("id_parent_id");
CREATE INDEX "version_section_texte_id" ON "version_section" ("texte_id");
CREATE INDEX "version_section_version_texte_id" ON "version_section" ("version_texte_id");
</syntaxhighlight>
; article
<syntaxhighlight lang="sql" enclose="div">
CREATE TABLE "article" (
"id" VARCHAR(20) NOT NULL PRIMARY KEY,
"nom" VARCHAR(200) NOT NULL,
"etat_juridique" VARCHAR(25) NOT NULL,
"num" VARCHAR(200) NOT NULL,
"debut" DATE NOT NULL,
"fin" DATE,
"texte_id" VARCHAR(20) NOT NULL,
"version_section_id" VARCHAR(20) NOT NULL,
"version_texte_id" INTEGER NOT NULL,
FOREIGN KEY ("texte_id") REFERENCES "texte" ("cid"),
FOREIGN KEY ("version_section_id") REFERENCES "version_section" ("id"),
FOREIGN KEY ("version_texte_id") REFERENCES "version_texte" ("id")
);
CREATE INDEX "article_texte_id" ON "article" ("texte_id");
CREATE INDEX "article_version_section_id" ON "article" ("version_section_id");
CREATE INDEX "article_version_texte_id" ON "article" ("version_texte_id");
</syntaxhighlight>
== Schéma SQL 2.0 ==
=== Graphique ===
[[Fichier:BDD Archéo Lex 2.0.svg|center]]
=== Aperçu général ===
Cette version apporte principalement la prise en compte des livraisons, i.e. les mises à jour successives de la base LEGI. La version 1.0 de la base de données ne pouvait pas distinguer les livraisons et il aurait alors été nécessaire de modifier directement les divers enregistrements, ce qui aurait pu corrompu la base de donnée si le programme était arrêté au cours de la mise à jour. Cette version de la base de données voit principalement l’ajout de tables pour ces livraisons, ainsi que diverses modifications mineures améliorant la cohérence.
Il y a donc deux axes d’évolution des versions manipulés par cette base de données :
* l’axe temporel (naturel) : les différentes évolutions du texte au cours du temps, par exemple les modifications d’un texte ou les différentes versions consolidées d’un code ; cet axe existait déjà dans la version 1.0 de la base de données et s’appuie entièrement sur les <u>dates de vigueur</u>
* l’axe des livraisons : au fur et à mesure des livraisons (<u>tables livraison</u>) : introduction de nouvelles versions de textes à la suite de la version la plus récente (évolution normale), réécriture de versions existantes (en cas d’erreur sur un champ, faute de frappe, etc.), ajout ou suppression de versions intermédiaires (en cas d’erreur sur les dates de vigueur)
Les deux axes d’évolution ne sont pas traités de façon identique mais s’inspirent des branches Git. Cela s’illustre par l’exemple suivant :
Axe temporel → T1 T2 T3 T4 T5 T6 T7 T8 ↓ Axe des livraisons
v1.0 v2.0 v3.0 v4.0 v5.0 -- livraison 0 : import initial
\ `v6.1 -- livraison 1 : ajout d’une nouvelle version normale
`v4.2 v5.2 v6.2 v7.2 -- livraison 2 : réécriture à partir de la version 4
`v7.3 v8.3 -- livraison 3 : introduction d’une version intermédiaire
Du fait que les livraisons peuvent ajouter des versions intermédiaires sur l’axe temporel (cf livraison 2 dans l’exemple), il peut y avoir un décalage entre les numéros d’ordre des versions et leurs dates (cf dans l’exemple v7.2 et v8.3 qui n’ont pas le même numéro d’ordre (7 et 8) mais la même date (T8). En général, lorsqu’on comparera sur l’axe des livraisons, on préférera donc les comparaisons de versions à même date plutôt qu’à même numéro d’ordre.
Les réécritures, introductions ou suppressions de versions intermédiaires peuvent être soit :
* ''normales'' : dans le cas de la manipulation des versions à venir (postérieures à la date de la livraison), lorsqu’une loi introduit une nouvelle version consolidée intermédiaire ; ou
* ''éditoriales'' : dans le cas de la manipulation des versions passées (antérieures à la date de la livraison), lorsqu’une erreur est corrigée ou que les dates de vigueur sont modifiées
Cette version de la base de données ne distingue pas ces deux types de réécriture, mais cela sera probablement ajouté dans la version 3.0 de la base de données.
=== Notes de modification ===
Modifications de la base de données par rapport à la version 1.0 :
* Ajouts, suppressions et modifications de tables :
** Ajout de la table <tt>livraison</tt> contenant les dates des livraisons, leur type ("fondation" (=dump complet) ou "miseajour" (=dump incrémental)) et un lien vers la livraison fondation le cas échéant
** Ajout de la table <tt>livraison_texte</tt> mettant en correspondance les textes, livraisons et versions de texte
** Ajout des tables <tt>liste_sections</tt> et <tt>liste_articles</tt> listant les sections et articles inclus dans une version de texte ; ce lien était auparavant fait directement dans <tt>version_section</tt> et <tt>article</tt>
** Retrait de la table <tt>section</tt>, inutilisée et inutile
** Renommage de la table <tt>article</tt> en <tt>version_article</tt> pour cohérence, puisque son rôle est identique à <tt>version_section</tt>
* Transferts de colonnes entre tables :
** De <tt>texte</tt> à <tt>version_texte</tt> : <tt>nature</tt>, <tt>date_texte</tt>, <tt>date_publi</tt> : pour permettre la modification de ces champs d’une livraison à l’autre
* Suppressions de colonnes :
** <tt>version_section</tt>/<tt>cid_id</tt> : car suppression de la table <tt>section</tt>
** <tt>version_section</tt>/<tt>version_texte_id</tt> et <tt>version_article</tt>/<tt>version_texte_id</tt> : il faut désormais passer par <tt>liste_sections</tt> et <tt>liste_articles</tt>
* Renommage de colonnes :
** <tt>debut</tt> et <tt>fin</tt> renommés en <tt>vigueur_debut</tt> et <tt>vigueur_fin</tt> : plus explicite étant donné que de multiples dates sont indiquées et manipulées
** dans <tt>version_article</tt>, <tt>num</tt> en <tt>numero</tt> : plus explicite et cohérence avec <tt>version_section</tt>
* Ajout de colonnes :
** <tt>version_texte</tt>/<tt>date_modif</tt> : date de dernière modification indiquée dans la base LEGI
* Modifications de colonnes :
** dans <tt>version_texte</tt>, la colonne <tt>base_id</tt> (référent à la première version d’un texte sur l’axe temporel) est modifiée en <tt>version_prec_id</tt> (référent à la version précédente sur l’axe temporel)
=== Opérations classiques ===
Les opérations classiques et prévues sur la base de données sont :
* Création ''ex nihilo'' de la base de données :
*# Insertion d’une ligne dans la table <tt>livraison</tt>
*# Insertion d’une ou plusieurs lignes dans la table <tt>texte</tt>
*# Calcul des versions de texte et insertion de celles-ci dans les tables <tt>version_{texte,section,article}</tt>
*# Insertion des lignes adéquates dans les tables <tt>livraison_texte</tt> et <tt>liste_{sections,articles}</tt>
* Mise à jour après une mise à jour incrémentale de la base LEGI : similaire au point précédent en n’ajoutant que les versions de textes, sections et articles nécessaires et en faisant les liens adéquats dans les tables livraison
* Mise à jour après un dump complet de la base LEGI : similaire aux premier et deuxième points en n’ajoutant que ce qui n’existe pas
* Requêter toutes les versions temporelles correspondant à une livraison :
*# Requête sur la table <tt>livraison_texte</tt> pour obtenir toutes les versions temporelles d’un texte
*# Requête sur la table <tt>version_texte</tt> pour obtenir les métadonnées sur les versions temporelles
*# Requête sur les tables <tt>liste_{sections,articles}</tt> pour obtenir les sections et articles
*# Requête sur les tables <tt>version_{sections,articles}</tt> pour obtenir les métadonnées et données sur les sections et articles
* Requêter les versions temporelles à une date donnée pour toutes les livraisons :
*# Requête sur la table <tt>version_texte</tt> en fixant le champ <tt>vigueur_debut</tt> (on peut aussi fixer <tt>vigueur_fin</tt> si on préfère ou même un intervalle temporel puisque la date est directement gérée par SQL)
*# Requête sur la table <tt>livraison_texte</tt> pour obtenir toutes les livraisons correspondantes à ces versions, si on veut
*# Requête sur les tables <tt>liste_{sections,articles}</tt> pour obtenir les sections et articles
*# Requête sur les tables <tt>version_{sections,articles}</tt> pour obtenir les métadonnées et données sur les sections et articles
Noter que pour la modification, l’ajout ou la suppression d’une section, il faut créer l’enregistrement dans <tt>version_section</tt>, puis créer des enregistrements de <tt>version_section</tt> pour toutes les sections enfants ainsi que les articles enfants, et ceci même si ceux-ci n’ont pas été changés. Cela est requis à cause du lien <tt>id_parent_id</tt> qui doit correspondre au nouveau élément. Je ne vois pas vraiment comment éviter cela, à part en créant une liste de sections ''alias'', c’est-à-dire que si une section enfant a un <tt>id_parent_id</tt> qui n’existe pas dans la <tt>liste_sections</tt> de cette version de texte, on cherchera le bon id de section dans une table <tt>alias_section</tt> (dans ce cas, ça serait juste pour les sections, pas pour les articles).
=== Design et évolutions futures ===
[[Catégorie:Archéo Lex]]
fd37af41d38d0c3ba54489b770dbe11c112ec667
Fichier:BDD Archéo Lex 1.0.svg
6
11
55
47
2014-12-23T22:40:13Z
Seb35
1
Seb35 a importé une nouvelle version de « [[Fichier:BDD Archéo Lex 1.0.svg]] »
wikitext
text/x-wiki
Licence WTFPL 2.0
Version BDD : 1.0
27795a057532cde04720376daa498a67506a83c4
Archéo Lex/archeo-lex.fr
0
16
56
2014-12-27T00:19:01Z
Seb35
1
création structure du site
wikitext
text/x-wiki
Le site [http://archeo-lex.fr archeo-lex.fr] rassemble les codes de lois français issus du programme Archéo Lex.
== Structure et URLs ==
* [http://archeo-lex.fr/ archeo-lex.fr/] Présentation générale
* [http://archeo-lex.fr/git/ archeo-lex.fr/git/] Présentation des codes avec une interface Git, en l’occurence GitList
** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle archeo-lex.fr/git/Code de la propriété intellectuelle] Page d’accueil d’un code
** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle/blob/master/Code%20de%20la%20propriete%20intellectuelle.md archeo-lex.fr/git/Code de la propriété intellectuelle/blob/master/Code de la propriete intellectuelle.md] Version actuelle d’un code
Prévu:
* [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle archeo-lex.fr/codes/Code de la propriété intellectuelle] Version actuelle du code
* [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30/2014-07-01 archeo-lex.fr/codes/Code de la propriété intellectuelle/2014-06-30/2014-07-01] Comparaison entre deux dates
* [http://archeo-lex.fr/2014-08-01/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30/2014-07-01 archeo-lex.fr/codes/Code de la propriété intellectuelle/2014-06-30/2014-07-01] Comparaison entre deux dates dans une livraison donnée
[[Catégorie:Archéo Lex]]
de1d0572065f94623f5bbde6ab895c3d7335955d
57
56
2014-12-27T09:25:43Z
Seb35
1
+1 url d’un commit
wikitext
text/x-wiki
Le site [http://archeo-lex.fr archeo-lex.fr] rassemble les codes de lois français issus du programme Archéo Lex.
== Structure et URLs ==
* [http://archeo-lex.fr/ archeo-lex.fr/] Présentation générale
* [http://archeo-lex.fr/git/ archeo-lex.fr/git/] Présentation des codes avec une interface Git, en l’occurence GitList
** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle archeo-lex.fr/git/Code de la propriété intellectuelle] Page d’accueil d’un code
** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle/blob/master/Code%20de%20la%20propriete%20intellectuelle.md archeo-lex.fr/git/Code de la propriété intellectuelle/blob/master/Code de la propriete intellectuelle.md] Version actuelle d’un code
** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle/commit/046549bdf8e6fbacd2dfeb0e82d41c06fe9bf7da archeo-lex.fr/git/Code de la propriété intellectuelle/commit/046549bdf8e6fbacd2dfeb0e82d41c06fe9bf7da] Une version (''commit'') spécifique
Prévu:
* [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle archeo-lex.fr/codes/Code de la propriété intellectuelle] Version actuelle du code
* [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30/2014-07-01 archeo-lex.fr/codes/Code de la propriété intellectuelle/2014-06-30/2014-07-01] Comparaison entre deux dates
* [http://archeo-lex.fr/2014-08-01/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30/2014-07-01 archeo-lex.fr/codes/Code de la propriété intellectuelle/2014-06-30/2014-07-01] Comparaison entre deux dates dans une livraison donnée
[[Catégorie:Archéo Lex]]
60fadc5eac9bb59f35c6c12ebcf0ff8410c1e626
58
57
2014-12-27T09:26:57Z
Seb35
1
+belle url d’une version
wikitext
text/x-wiki
Le site [http://archeo-lex.fr archeo-lex.fr] rassemble les codes de lois français issus du programme Archéo Lex.
== Structure et URLs ==
* [http://archeo-lex.fr/ archeo-lex.fr/] Présentation générale
* [http://archeo-lex.fr/git/ archeo-lex.fr/git/] Présentation des codes avec une interface Git, en l’occurence GitList
** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle archeo-lex.fr/git/Code de la propriété intellectuelle] Page d’accueil d’un code
** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle/blob/master/Code%20de%20la%20propriete%20intellectuelle.md archeo-lex.fr/git/Code de la propriété intellectuelle/blob/master/Code de la propriete intellectuelle.md] Version actuelle d’un code
** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle/commit/046549bdf8e6fbacd2dfeb0e82d41c06fe9bf7da archeo-lex.fr/git/Code de la propriété intellectuelle/commit/046549bdf8e6fbacd2dfeb0e82d41c06fe9bf7da] Une version (''commit'') spécifique
Prévu:
* [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle archeo-lex.fr/codes/Code de la propriété intellectuelle] Version actuelle du code
* [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30 archeo-lex.fr/codes/Code de la propriété intellectuelle/2014-06-30] Une version spécifique
* [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30/2014-07-01 archeo-lex.fr/codes/Code de la propriété intellectuelle/2014-06-30/2014-07-01] Comparaison entre deux dates
* [http://archeo-lex.fr/2014-08-01/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30/2014-07-01 archeo-lex.fr/codes/Code de la propriété intellectuelle/2014-06-30/2014-07-01] Comparaison entre deux dates dans une livraison donnée
[[Catégorie:Archéo Lex]]
51ad56edd6748fd9f7831a3b12e7fcfa81f2ce1e
59
58
2014-12-27T09:28:38Z
Seb35
1
typo
wikitext
text/x-wiki
Le site [http://archeo-lex.fr archeo-lex.fr] rassemble les codes de lois français issus du programme Archéo Lex.
== Structure et URLs ==
* [http://archeo-lex.fr/ archeo-lex.fr/] Présentation générale
* [http://archeo-lex.fr/git/ archeo-lex.fr/git/] Présentation des codes avec une interface Git, en l’occurence GitList
** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle archeo-lex.fr/git/Code de la propriété intellectuelle] Page d’accueil d’un code
** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle/blob/master/Code%20de%20la%20propriete%20intellectuelle.md archeo-lex.fr/git/Code de la propriété intellectuelle/blob/master/Code de la propriete intellectuelle.md] Version actuelle d’un code
** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle/commit/046549bdf8e6fbacd2dfeb0e82d41c06fe9bf7da archeo-lex.fr/git/Code de la propriété intellectuelle/commit/046549bdf8e6fbacd2dfeb0e82d41c06fe9bf7da] Une version (''commit'') spécifique
Prévu:
* [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle archeo-lex.fr/codes/Code de la propriété intellectuelle] Version actuelle du code
* [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30 archeo-lex.fr/codes/Code de la propriété intellectuelle/2014-06-30] Une version spécifique
* [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30/2014-07-01 archeo-lex.fr/codes/Code de la propriété intellectuelle/2014-06-30/2014-07-01] Comparaison entre deux dates
* [http://archeo-lex.fr/2014-08-01/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30/2014-07-01 archeo-lex.fr/2014-08-01/codes/Code de la propriété intellectuelle/2014-06-30/2014-07-01] Comparaison entre deux dates dans une livraison donnée
[[Catégorie:Archéo Lex]]
0e254baf2ec745ce1511f9786a31010d89905b65
60
59
2014-12-27T09:46:10Z
Seb35
1
meilleure intro
wikitext
text/x-wiki
Le site [http://archeo-lex.fr archeo-lex.fr] est une vitrine du programme Archéo Lex, qui en soit n’est qu’un programme de traitement et n’est ni visuel, ni utilisable par des non-informaticiens. Ainsi, ce site rend les résultats d’Archéo Lex réellement utilisable par la communauté de l’information légale.
Le site est hébergé sur mon serveur personel (un DreamPlug, i.e. un micro-serveur) derrière une ligne ADSL. S’il nécessite plus de ressources, je le déplacerai sur un vrai serveur plus puissant avec une meilleure connexion (si vous avez un bout de serveur de dispo pour le site archeo-lex.fr, je suis intéressé).
== Structure et URLs ==
* [http://archeo-lex.fr/ archeo-lex.fr/] Présentation générale
* [http://archeo-lex.fr/git/ archeo-lex.fr/git/] Présentation des codes avec une interface Git, en l’occurence GitList
** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle archeo-lex.fr/git/Code de la propriété intellectuelle] Page d’accueil d’un code
** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle/blob/master/Code%20de%20la%20propriete%20intellectuelle.md archeo-lex.fr/git/Code de la propriété intellectuelle/blob/master/Code de la propriete intellectuelle.md] Version actuelle d’un code
** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle/commit/046549bdf8e6fbacd2dfeb0e82d41c06fe9bf7da archeo-lex.fr/git/Code de la propriété intellectuelle/commit/046549bdf8e6fbacd2dfeb0e82d41c06fe9bf7da] Une version (''commit'') spécifique
Prévu:
* [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle archeo-lex.fr/codes/Code de la propriété intellectuelle] Version actuelle du code
* [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30 archeo-lex.fr/codes/Code de la propriété intellectuelle/2014-06-30] Une version spécifique
* [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30/2014-07-01 archeo-lex.fr/codes/Code de la propriété intellectuelle/2014-06-30/2014-07-01] Comparaison entre deux dates
* [http://archeo-lex.fr/2014-08-01/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30/2014-07-01 archeo-lex.fr/2014-08-01/codes/Code de la propriété intellectuelle/2014-06-30/2014-07-01] Comparaison entre deux dates dans une livraison donnée
[[Catégorie:Archéo Lex]]
21285cbf5a358826bc64c9501dbe45380ee5215e
61
60
2014-12-27T10:26:47Z
Seb35
1
+lien gitlist
wikitext
text/x-wiki
Le site [http://archeo-lex.fr archeo-lex.fr] est une vitrine du programme Archéo Lex, qui en soit n’est qu’un programme de traitement et n’est ni visuel, ni utilisable par des non-informaticiens. Ainsi, ce site rend les résultats d’Archéo Lex réellement utilisable par la communauté de l’information légale.
Le site est hébergé sur mon serveur personel (un DreamPlug, i.e. un micro-serveur) derrière une ligne ADSL. S’il nécessite plus de ressources, je le déplacerai sur un vrai serveur plus puissant avec une meilleure connexion (si vous avez un bout de serveur de dispo pour le site archeo-lex.fr, je suis intéressé).
L’interface web de Git est [http://gitlist.org GitList], que je trouve assez utilisable et jolie, en plus d’être proche de celle de GitHub (elle-même jolie et utilisable).
== Structure et URLs ==
* [http://archeo-lex.fr/ archeo-lex.fr/] Présentation générale
* [http://archeo-lex.fr/git/ archeo-lex.fr/git/] Présentation des codes avec une interface Git, en l’occurence GitList
** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle archeo-lex.fr/git/Code de la propriété intellectuelle] Page d’accueil d’un code
** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle/blob/master/Code%20de%20la%20propriete%20intellectuelle.md archeo-lex.fr/git/Code de la propriété intellectuelle/blob/master/Code de la propriete intellectuelle.md] Version actuelle d’un code
** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle/commit/046549bdf8e6fbacd2dfeb0e82d41c06fe9bf7da archeo-lex.fr/git/Code de la propriété intellectuelle/commit/046549bdf8e6fbacd2dfeb0e82d41c06fe9bf7da] Une version (''commit'') spécifique
Prévu:
* [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle archeo-lex.fr/codes/Code de la propriété intellectuelle] Version actuelle du code
* [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30 archeo-lex.fr/codes/Code de la propriété intellectuelle/2014-06-30] Une version spécifique
* [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30/2014-07-01 archeo-lex.fr/codes/Code de la propriété intellectuelle/2014-06-30/2014-07-01] Comparaison entre deux dates
* [http://archeo-lex.fr/2014-08-01/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30/2014-07-01 archeo-lex.fr/2014-08-01/codes/Code de la propriété intellectuelle/2014-06-30/2014-07-01] Comparaison entre deux dates dans une livraison donnée
[[Catégorie:Archéo Lex]]
d8be2f6fc3d983a27b6a9bf714ba63a73d4c234f
63
61
2014-12-28T12:49:31Z
Seb35
1
+bandeau déplacé sur github.com
wikitext
text/x-wiki
<div align="center"><div style="background-color:#aeff00;border:2px solid #54ff00;opacity:0.8;padding:5px;display:inline-block;">Déplacé sur https://github.com/Seb35/Archeo-Lex/wiki/archeo-lex.fr</div></div>
Le site [http://archeo-lex.fr archeo-lex.fr] est une vitrine du programme Archéo Lex, qui en soit n’est qu’un programme de traitement et n’est ni visuel, ni utilisable par des non-informaticiens. Ainsi, ce site rend les résultats d’Archéo Lex réellement utilisable par la communauté de l’information légale.
Le site est hébergé sur mon serveur personel (un DreamPlug, i.e. un micro-serveur) derrière une ligne ADSL. S’il nécessite plus de ressources, je le déplacerai sur un vrai serveur plus puissant avec une meilleure connexion (si vous avez un bout de serveur de dispo pour le site archeo-lex.fr, je suis intéressé).
L’interface web de Git est [http://gitlist.org GitList], que je trouve assez utilisable et jolie, en plus d’être proche de celle de GitHub (elle-même jolie et utilisable).
== Structure et URLs ==
* [http://archeo-lex.fr/ archeo-lex.fr/] Présentation générale
* [http://archeo-lex.fr/git/ archeo-lex.fr/git/] Présentation des codes avec une interface Git, en l’occurence GitList
** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle archeo-lex.fr/git/Code de la propriété intellectuelle] Page d’accueil d’un code
** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle/blob/master/Code%20de%20la%20propriete%20intellectuelle.md archeo-lex.fr/git/Code de la propriété intellectuelle/blob/master/Code de la propriete intellectuelle.md] Version actuelle d’un code
** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle/commit/046549bdf8e6fbacd2dfeb0e82d41c06fe9bf7da archeo-lex.fr/git/Code de la propriété intellectuelle/commit/046549bdf8e6fbacd2dfeb0e82d41c06fe9bf7da] Une version (''commit'') spécifique
Prévu:
* [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle archeo-lex.fr/codes/Code de la propriété intellectuelle] Version actuelle du code
* [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30 archeo-lex.fr/codes/Code de la propriété intellectuelle/2014-06-30] Une version spécifique
* [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30/2014-07-01 archeo-lex.fr/codes/Code de la propriété intellectuelle/2014-06-30/2014-07-01] Comparaison entre deux dates
* [http://archeo-lex.fr/2014-08-01/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30/2014-07-01 archeo-lex.fr/2014-08-01/codes/Code de la propriété intellectuelle/2014-06-30/2014-07-01] Comparaison entre deux dates dans une livraison donnée
[[Catégorie:Archéo Lex]]
29614ea65af774b96519d307fea74f5121333ee5
91
63
2015-02-11T16:21:47Z
Seb35
1
+modèle Transféré
wikitext
text/x-wiki
{{Transféré|https://github.com/Seb35/Archeo-Lex/wiki/archeo-lex.fr}}
Le site [http://archeo-lex.fr archeo-lex.fr] est une vitrine du programme Archéo Lex, qui en soit n’est qu’un programme de traitement et n’est ni visuel, ni utilisable par des non-informaticiens. Ainsi, ce site rend les résultats d’Archéo Lex réellement utilisable par la communauté de l’information légale.
Le site est hébergé sur mon serveur personel (un DreamPlug, i.e. un micro-serveur) derrière une ligne ADSL. S’il nécessite plus de ressources, je le déplacerai sur un vrai serveur plus puissant avec une meilleure connexion (si vous avez un bout de serveur de dispo pour le site archeo-lex.fr, je suis intéressé).
L’interface web de Git est [http://gitlist.org GitList], que je trouve assez utilisable et jolie, en plus d’être proche de celle de GitHub (elle-même jolie et utilisable).
== Structure et URLs ==
* [http://archeo-lex.fr/ archeo-lex.fr/] Présentation générale
* [http://archeo-lex.fr/git/ archeo-lex.fr/git/] Présentation des codes avec une interface Git, en l’occurence GitList
** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle archeo-lex.fr/git/Code de la propriété intellectuelle] Page d’accueil d’un code
** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle/blob/master/Code%20de%20la%20propriete%20intellectuelle.md archeo-lex.fr/git/Code de la propriété intellectuelle/blob/master/Code de la propriete intellectuelle.md] Version actuelle d’un code
** [http://archeo-lex.fr/git/Code%20de%20la%20propriété%20intellectuelle/commit/046549bdf8e6fbacd2dfeb0e82d41c06fe9bf7da archeo-lex.fr/git/Code de la propriété intellectuelle/commit/046549bdf8e6fbacd2dfeb0e82d41c06fe9bf7da] Une version (''commit'') spécifique
Prévu:
* [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle archeo-lex.fr/codes/Code de la propriété intellectuelle] Version actuelle du code
* [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30 archeo-lex.fr/codes/Code de la propriété intellectuelle/2014-06-30] Une version spécifique
* [http://archeo-lex.fr/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30/2014-07-01 archeo-lex.fr/codes/Code de la propriété intellectuelle/2014-06-30/2014-07-01] Comparaison entre deux dates
* [http://archeo-lex.fr/2014-08-01/codes/Code%20de%20la%20propriété%20intellectuelle/2014-06-30/2014-07-01 archeo-lex.fr/2014-08-01/codes/Code de la propriété intellectuelle/2014-06-30/2014-07-01] Comparaison entre deux dates dans une livraison donnée
[[Catégorie:Archéo Lex]]
2476e6b6404b02909ab9b2302f3600cc198c830f
Archéo Lex/Ressources externes
0
17
62
2014-12-28T11:19:49Z
Seb35
1
recensement de quelques liens
wikitext
text/x-wiki
== Git ==
=== Tutoriels ===
* [http://rogerdudler.github.io/git-guide/index.fr.html Guide rapide d’introduction à Git], multilingue dont français, contient des installeurs Windows et Mac OS X
* [http://doc.ubuntu-fr.org/git Guide sur ubuntu-fr.org], en particulier plusieurs liens externes
=== Livres ===
* [http://git-scm.com/book/en/v2/ Livre officiel] en anglais (version 2)
* [http://git-scm.com/book/fr/ Livre officiel] en français (version 1)
=== Logiciels ===
==== Pour Linux ====
==== Pour Mac OS X ====
* [https://code.google.com/p/git-osx-installer/downloads/list?can=3 Installeur pour Mac OS X]
==== Pour Windows ====
* [http://msysgit.github.io/ Installeur pour Windows]
== GitList ==
* [http://gitlist.org gitlist.org]
* [https://github.com/klaussilveira/gitlist github.com:klaussilveira/gitlist]
* [http://weininger.net/configuration-of-nginx-for-gitweb-and-git-http-backend.html nginx+Git+Git viewer] pour faire cohabiter les URLs du Git viewer et du protocole Git, avec nginx
84d0792133dd3c3687aa4ea65b064c17e93b0199
65
62
2014-12-28T20:10:17Z
Seb35
1
déplacé sur github
wikitext
text/x-wiki
<div align="center"><div style="background-color:#aeff00;border:2px solid #54ff00;opacity:0.8;padding:5px;display:inline-block;">Déplacé sur https://github.com/Seb35/Archeo-Lex/wiki/Ressources_externes</div></div>
== Git ==
=== Tutoriels ===
* [http://rogerdudler.github.io/git-guide/index.fr.html Guide rapide d’introduction à Git], multilingue dont français, contient des installeurs Windows et Mac OS X
* [http://doc.ubuntu-fr.org/git Guide sur ubuntu-fr.org], en particulier plusieurs liens externes
=== Livres ===
* [http://git-scm.com/book/en/v2/ Livre officiel] en anglais (version 2)
* [http://git-scm.com/book/fr/ Livre officiel] en français (version 1)
=== Logiciels ===
==== Pour Linux ====
==== Pour Mac OS X ====
* [https://code.google.com/p/git-osx-installer/downloads/list?can=3 Installeur pour Mac OS X]
==== Pour Windows ====
* [http://msysgit.github.io/ Installeur pour Windows]
== GitList ==
* [http://gitlist.org gitlist.org]
* [https://github.com/klaussilveira/gitlist github.com:klaussilveira/gitlist]
* [http://weininger.net/configuration-of-nginx-for-gitweb-and-git-http-backend.html nginx+Git+Git viewer] pour faire cohabiter les URLs du Git viewer et du protocole Git, avec nginx
210d6c17d1bc504c4954d277d07f7e9fc3f4582f
92
65
2015-02-11T16:22:16Z
Seb35
1
+modèle Transféré
wikitext
text/x-wiki
{{Transféré|https://github.com/Seb35/Archeo-Lex/wiki/Ressources_externes}}
== Git ==
=== Tutoriels ===
* [http://rogerdudler.github.io/git-guide/index.fr.html Guide rapide d’introduction à Git], multilingue dont français, contient des installeurs Windows et Mac OS X
* [http://doc.ubuntu-fr.org/git Guide sur ubuntu-fr.org], en particulier plusieurs liens externes
=== Livres ===
* [http://git-scm.com/book/en/v2/ Livre officiel] en anglais (version 2)
* [http://git-scm.com/book/fr/ Livre officiel] en français (version 1)
=== Logiciels ===
==== Pour Linux ====
==== Pour Mac OS X ====
* [https://code.google.com/p/git-osx-installer/downloads/list?can=3 Installeur pour Mac OS X]
==== Pour Windows ====
* [http://msysgit.github.io/ Installeur pour Windows]
== GitList ==
* [http://gitlist.org gitlist.org]
* [https://github.com/klaussilveira/gitlist github.com:klaussilveira/gitlist]
* [http://weininger.net/configuration-of-nginx-for-gitweb-and-git-http-backend.html nginx+Git+Git viewer] pour faire cohabiter les URLs du Git viewer et du protocole Git, avec nginx
6297aeebaf9f2954f148f61b4c80bbcf9d44ffb3
Archéo Lex/Base LEGI
0
12
64
43
2014-12-28T12:50:10Z
Seb35
1
+bandeau déplacé sur github.com
wikitext
text/x-wiki
<div align="center"><div style="background-color:#aeff00;border:2px solid #54ff00;opacity:0.8;padding:5px;display:inline-block;">Déplacé sur https://github.com/Seb35/Archeo-Lex/wiki/Base_LEGI</div></div>
Cette page explique le parsement (''parsing'') de la base LEGI en vue de créer le dépôt Git, en se concentrant sur les fichiers et balises XML importantes pour réaliser cette tâche. L’exemple d’illustration sera le code de la propriété intellectuelle (CPI) dont l’identifiant est LEGITEXT000006069414.
De façon générale, pour un identifiant "LEGIABCD123456789012", le fichier XML sera accessible via le chemin "LEGI/ABCD/12/34/56/78/90/LEGIABCD123456789012.xml" (noter que les deux derniers chiffres n’ont pas de sous-répertoire dédié, le dernier sous-répertoire pouvant contenir jusqu’à 100 fichiers XML correspondant à ces deux derniers chiffres).
'''1.''' Aller dans le répertoire du code "legi/global/code_et_TNC_en_vigueur/code_en_vigueur/LEGI/TEXT/**/**/**/**/**/LEGITEXT************".
:Pour le CPI, cela sera le sous-dossier "legi/global/code_et_TNC_en_vigueur/code_en_vigueur/LEGI/TEXT/00/00/06/06/94/LEGITEXT000006069414".
:Ce dossier contient trois sous-dossiers :
:* "article" : contient tous les articles du code, rangés dans des sous-dossiers en fonction de leur identifiant
:* "section_ta" : similaire aux articles, mais pour les sections (les titres de parties)
:* "texte" : ce sous-dossier est celui qui nous intéressera en premier lieu car il contient les métadonnées de base du texte ainsi que les points d’entrée pour parcourir récursivement les sections et articles
'''2.''' Ouvrir le fichier "texte/version/LEGITEXT************.xml"
: Pour le CPI, le fichier est "texte/version/LEGITEXT000006069414.xml".
: Ce fichier XML les métadonnées générales du texte. Il contient les balises suivantes importantes :
:* TEXTE_VERSION / META / META_COMMUN / ID : identifiant du texte (que l’on avait déjà), par exemple "LEGITEXT000006069414" (l’ID désigne l’identifiant unique de l’objet XML (=texte, section ou article)
:* TEXTE_VERSION / META / META_COMMUN / NATURE : nature du texte, pour nous "CODE"
:* TEXTE_VERSION / META / META_SPEC / META_TEXTE_CHRONICLE / CID : identifiant du texte, par exemple "LEGITEXT000006069414" (il n’y a pas de différence ici avec l’ID précédent puisque l’objet XML est le texte lui-même, mais lorsqu’on parcourera les autres objets XML le champ CID sera toujours l’identifiant du texte)
:* TEXTE_VERSION / META / META_SPEC / META_TEXTE_CHRONICLE / DATE_PUBLI : date de publication au JO du texte (la date spéciale 2999-01-01 indique une absence de date ; pour les codes, il n’y en a pas sur textes eux-même mais uniquement sur les sections et articles)
:* TEXTE_VERSION / META / META_SPEC / META_TEXTE_CHRONICLE / DATE_TEXTE : date d’entrée de signature du texte
:* TEXTE_VERSION / META / META_SPEC / META_TEXTE_VERSION / TITRE : titre du texte, par exemple "Code de la propriété intellectuelle"
:* TEXTE_VERSION / META / META_SPEC / META_TEXTE_VERSION / ETAT : statut juridique du texte, par exemple "VIGUEUR" (ou "ABROGE", "ANNULE", "MODIFIE", etc.)
'''3.''' Ouvrir le fichier "texte/struct/LEGITEXT************.xml"
: Pour le CPI, le fichier est "texte/struct/LEGITEXT000006069414.xml".
: Ce fichier XML contient les sections (titres de parties) de plus haut niveau du texte avec, pour chacune, les dates où elles ont été en vigueur. Par exemple, on pourra avoir les sections "Partie législative" et "Partie réglementaire". Les balises importantes sont :
:* TEXTELR / META / META_COMMUN / ID : identifiant de l’objet XML, par exemple "LEGITEXT000006069414" (encore le même que le texte puisque ce fichier est unique pour un même code)
:* TEXTELR / META / META_SPEC / META_TEXTE_CHRONICLE / CID : identifiant du texte
:* TEXTELR / META / META_SPEC / META_TEXTE_CHRONICLE / DATE_PUBLI et DATE_TEXTE : date de publication au JO et date d’entrée en vigueur
:* TEXTELR / META / META_SPEC / META_TEXTE_CHRONICLE / DERNIERE_MODIFICATION : date de la dernière modification dans la base LEGI
:* TEXTELR / STRUCT / (LIEN_SECTION_TA)* : sections de plus haut niveau ; les attributs importants pour une balise donnée sont :
:** cid et id : identifiant de la section ; cela va nous permettre d’aller chercher récursivement les sections enfants de cette section dans l’étape suivante
:** debut, fin, etat : similaire à ce qu’on a déjà vu ; les dates sont les dates d’entrée en vigueur
:** niv : niveau de la section, il est à 1 pour l’instant et ira croissant en fonction de la profondeur de la section
:** le contenu de cette balise est le nom de la section
'''4.''' Ouvrir les fichiers "section_ta/LEGI/SCTA/**/**/**/**/**/**/LEGISCTA************.xml"
: Pour le CPI, on pourra prendre la première section ("Partie législative") avec le fichier "section_ta/LEGI/SCTA/00/00/06/08/36/LEGISCTA000006083673.xml".
: Ce fichier XML reprend les informations de la section en cours et indique les sections enfants. Les balises sont :
:* SECTION_TA / ID : identifiant de la section en cours
:* SECTION_TA / TITRE : titre de la section, par exemple "Partie législative"
:* SECTION_TA / CONTEXTE / TEXTE et TITRE_TXT : reprend les informations du texte auquel se rattache cette section, dont le cid (identifiant du texte)
:* SECTION_TA / STRUCTURE_TA / (LIEN_SECTION_TA)* : sections de niveau juste inférieur ; les attributs sont similaires à l’étape précédente, l’attribut cid est particulièrement important pour continuer la récursion ; le texte contenu dans cette balise est le nom de la section concernée (de niveau juste inférieur)
'''5.''' Continuer la récursion jusqu’à arriver à des sections comprenant des articles
: Pour le CPI, on pourra prendre "section_ta/LEGI/SCTA/00/00/06/16/16/LEGISCTA000006161633.xml" correspondant à la Partie législative → Première partie : La propriété littéraire et artistique → Livre Ier : Le droit d'auteur → Titre Ier : Objet du droit d'auteur → Chapitre Ier : Nature du droit d'auteur.
: Ce fichier XML est similaire aux sections parentes mais il contient les identifiants des articles, ainsi que l’état juridique des articles. Les nouvelles balises sont :
:* SECTION_TA / CONTEXTE / (TM / TITRE_TM)* : sections de niveau plus élevées, si besoin pour s’y retrouver
:* SECTION_TA / STRUCTURE_TA / (LIEN_ART)* : articles de la section ; les attributs sont classiques ; noter en particulier num qui contient le nom de l’article, par exemple "L111-1" ; noter que plusieurs balises peuvent avoir le même num lorsque leur état juridique est différent
'''6.''' Ouvrir les fichiers des articles "article/LEGI/ARTI/00/00/06/27/88/LEGIARTI000006278868.xml"
: Pour le CPI, on pourra prendre "article/LEGI/ARTI/00/00/06/27/88/LEGIARTI000006278868.xml" correspondant à l’article L111-1 en vigueur (il existe une précédente version de cet article L111-1 avec l’identifiant LEGIARTI000006278867).
: Ce fichier XML contient une version d’un article, comprenant les métadonnées de l’article, sa rédaction et des liens avec d’autres textes ou articles. Les balises sont :
:* ARTICLE / META / META_COMMUN / ID : identifiant de l’article ; les autres versions de l’article (portant le même nom) auront un identifiant différent
:* ARTICLE / META / META_SPEC / META_ARTICLE / NUM et ETAT : numéro/nom de l’article et son état juridique
:* ARTICLE / META / META_SPEC / META_ARTICLE / DATE_DEBUT et DATE_FIN : la date d’entrée en vigueur et de fin de vigueur ; si l’article est toujours en vigueur, sa date de fin devrait être 2999-01-01
:* ARTICLE / CONTEXTE : sections parentes de l’article et texte, similaire à ce qu’on trouvait dans les sections
:* ARTICLE / VERSIONS / (VERSION)* : autres versions de l’article, avec leurs états juridiques
:* ARTICLE / BLOC_TEXTUEL / CONTENU : rédaction de cette version de l’article, au format HTML
:* ARTICLE / LIENS / (LIEN)* : liens vers ou depuis d’autres articles, du même code ou d’autres textes ; historique de l’article lorsqu’il provient d’une loi antérieure ; lien vers le texte ayant mené à la codification du texte
Pour les lois, décrets, arrêtés et autres, la structure est similaire mais généralement plus simple puisqu’il n’y a pas de sections. Les lois sont dans le dossier "legi/global/code_et_TNC_en_vigueur/TNC_en_vigueur" (abréviation de "textes non codifiés") et sont transférées dans "legi/global/code_et_TNC_non_vigueur/TNC_non_vigueur" lorsqu’elles ne sont plus en vigueur (probablement comme les codes, mais ceux-ci ont une durée de vie longue).
L’espace de noms "JORFTEXT" est plus difficile à explorer : il est étalé sur les sections TNC_en_vigueur et TNC_non_vigueur, il peut contenir des objets de l’espace de noms LEGITEXT. Le sous-dossier "texte/version" peut alors contenir un ou plusieurs fichiers LEGITEXT.
[[Catégorie:Archéo Lex]]
55b9bf3c5ddc48d84d3884fd36e4e8e1daff4b68
90
64
2015-02-11T16:21:20Z
Seb35
1
+modèle Transféré
wikitext
text/x-wiki
{{Transféré|https://github.com/Seb35/Archeo-Lex/wiki/Base_LEGI}}
Cette page explique le parsement (''parsing'') de la base LEGI en vue de créer le dépôt Git, en se concentrant sur les fichiers et balises XML importantes pour réaliser cette tâche. L’exemple d’illustration sera le code de la propriété intellectuelle (CPI) dont l’identifiant est LEGITEXT000006069414.
De façon générale, pour un identifiant "LEGIABCD123456789012", le fichier XML sera accessible via le chemin "LEGI/ABCD/12/34/56/78/90/LEGIABCD123456789012.xml" (noter que les deux derniers chiffres n’ont pas de sous-répertoire dédié, le dernier sous-répertoire pouvant contenir jusqu’à 100 fichiers XML correspondant à ces deux derniers chiffres).
'''1.''' Aller dans le répertoire du code "legi/global/code_et_TNC_en_vigueur/code_en_vigueur/LEGI/TEXT/**/**/**/**/**/LEGITEXT************".
:Pour le CPI, cela sera le sous-dossier "legi/global/code_et_TNC_en_vigueur/code_en_vigueur/LEGI/TEXT/00/00/06/06/94/LEGITEXT000006069414".
:Ce dossier contient trois sous-dossiers :
:* "article" : contient tous les articles du code, rangés dans des sous-dossiers en fonction de leur identifiant
:* "section_ta" : similaire aux articles, mais pour les sections (les titres de parties)
:* "texte" : ce sous-dossier est celui qui nous intéressera en premier lieu car il contient les métadonnées de base du texte ainsi que les points d’entrée pour parcourir récursivement les sections et articles
'''2.''' Ouvrir le fichier "texte/version/LEGITEXT************.xml"
: Pour le CPI, le fichier est "texte/version/LEGITEXT000006069414.xml".
: Ce fichier XML les métadonnées générales du texte. Il contient les balises suivantes importantes :
:* TEXTE_VERSION / META / META_COMMUN / ID : identifiant du texte (que l’on avait déjà), par exemple "LEGITEXT000006069414" (l’ID désigne l’identifiant unique de l’objet XML (=texte, section ou article)
:* TEXTE_VERSION / META / META_COMMUN / NATURE : nature du texte, pour nous "CODE"
:* TEXTE_VERSION / META / META_SPEC / META_TEXTE_CHRONICLE / CID : identifiant du texte, par exemple "LEGITEXT000006069414" (il n’y a pas de différence ici avec l’ID précédent puisque l’objet XML est le texte lui-même, mais lorsqu’on parcourera les autres objets XML le champ CID sera toujours l’identifiant du texte)
:* TEXTE_VERSION / META / META_SPEC / META_TEXTE_CHRONICLE / DATE_PUBLI : date de publication au JO du texte (la date spéciale 2999-01-01 indique une absence de date ; pour les codes, il n’y en a pas sur textes eux-même mais uniquement sur les sections et articles)
:* TEXTE_VERSION / META / META_SPEC / META_TEXTE_CHRONICLE / DATE_TEXTE : date d’entrée de signature du texte
:* TEXTE_VERSION / META / META_SPEC / META_TEXTE_VERSION / TITRE : titre du texte, par exemple "Code de la propriété intellectuelle"
:* TEXTE_VERSION / META / META_SPEC / META_TEXTE_VERSION / ETAT : statut juridique du texte, par exemple "VIGUEUR" (ou "ABROGE", "ANNULE", "MODIFIE", etc.)
'''3.''' Ouvrir le fichier "texte/struct/LEGITEXT************.xml"
: Pour le CPI, le fichier est "texte/struct/LEGITEXT000006069414.xml".
: Ce fichier XML contient les sections (titres de parties) de plus haut niveau du texte avec, pour chacune, les dates où elles ont été en vigueur. Par exemple, on pourra avoir les sections "Partie législative" et "Partie réglementaire". Les balises importantes sont :
:* TEXTELR / META / META_COMMUN / ID : identifiant de l’objet XML, par exemple "LEGITEXT000006069414" (encore le même que le texte puisque ce fichier est unique pour un même code)
:* TEXTELR / META / META_SPEC / META_TEXTE_CHRONICLE / CID : identifiant du texte
:* TEXTELR / META / META_SPEC / META_TEXTE_CHRONICLE / DATE_PUBLI et DATE_TEXTE : date de publication au JO et date d’entrée en vigueur
:* TEXTELR / META / META_SPEC / META_TEXTE_CHRONICLE / DERNIERE_MODIFICATION : date de la dernière modification dans la base LEGI
:* TEXTELR / STRUCT / (LIEN_SECTION_TA)* : sections de plus haut niveau ; les attributs importants pour une balise donnée sont :
:** cid et id : identifiant de la section ; cela va nous permettre d’aller chercher récursivement les sections enfants de cette section dans l’étape suivante
:** debut, fin, etat : similaire à ce qu’on a déjà vu ; les dates sont les dates d’entrée en vigueur
:** niv : niveau de la section, il est à 1 pour l’instant et ira croissant en fonction de la profondeur de la section
:** le contenu de cette balise est le nom de la section
'''4.''' Ouvrir les fichiers "section_ta/LEGI/SCTA/**/**/**/**/**/**/LEGISCTA************.xml"
: Pour le CPI, on pourra prendre la première section ("Partie législative") avec le fichier "section_ta/LEGI/SCTA/00/00/06/08/36/LEGISCTA000006083673.xml".
: Ce fichier XML reprend les informations de la section en cours et indique les sections enfants. Les balises sont :
:* SECTION_TA / ID : identifiant de la section en cours
:* SECTION_TA / TITRE : titre de la section, par exemple "Partie législative"
:* SECTION_TA / CONTEXTE / TEXTE et TITRE_TXT : reprend les informations du texte auquel se rattache cette section, dont le cid (identifiant du texte)
:* SECTION_TA / STRUCTURE_TA / (LIEN_SECTION_TA)* : sections de niveau juste inférieur ; les attributs sont similaires à l’étape précédente, l’attribut cid est particulièrement important pour continuer la récursion ; le texte contenu dans cette balise est le nom de la section concernée (de niveau juste inférieur)
'''5.''' Continuer la récursion jusqu’à arriver à des sections comprenant des articles
: Pour le CPI, on pourra prendre "section_ta/LEGI/SCTA/00/00/06/16/16/LEGISCTA000006161633.xml" correspondant à la Partie législative → Première partie : La propriété littéraire et artistique → Livre Ier : Le droit d'auteur → Titre Ier : Objet du droit d'auteur → Chapitre Ier : Nature du droit d'auteur.
: Ce fichier XML est similaire aux sections parentes mais il contient les identifiants des articles, ainsi que l’état juridique des articles. Les nouvelles balises sont :
:* SECTION_TA / CONTEXTE / (TM / TITRE_TM)* : sections de niveau plus élevées, si besoin pour s’y retrouver
:* SECTION_TA / STRUCTURE_TA / (LIEN_ART)* : articles de la section ; les attributs sont classiques ; noter en particulier num qui contient le nom de l’article, par exemple "L111-1" ; noter que plusieurs balises peuvent avoir le même num lorsque leur état juridique est différent
'''6.''' Ouvrir les fichiers des articles "article/LEGI/ARTI/00/00/06/27/88/LEGIARTI000006278868.xml"
: Pour le CPI, on pourra prendre "article/LEGI/ARTI/00/00/06/27/88/LEGIARTI000006278868.xml" correspondant à l’article L111-1 en vigueur (il existe une précédente version de cet article L111-1 avec l’identifiant LEGIARTI000006278867).
: Ce fichier XML contient une version d’un article, comprenant les métadonnées de l’article, sa rédaction et des liens avec d’autres textes ou articles. Les balises sont :
:* ARTICLE / META / META_COMMUN / ID : identifiant de l’article ; les autres versions de l’article (portant le même nom) auront un identifiant différent
:* ARTICLE / META / META_SPEC / META_ARTICLE / NUM et ETAT : numéro/nom de l’article et son état juridique
:* ARTICLE / META / META_SPEC / META_ARTICLE / DATE_DEBUT et DATE_FIN : la date d’entrée en vigueur et de fin de vigueur ; si l’article est toujours en vigueur, sa date de fin devrait être 2999-01-01
:* ARTICLE / CONTEXTE : sections parentes de l’article et texte, similaire à ce qu’on trouvait dans les sections
:* ARTICLE / VERSIONS / (VERSION)* : autres versions de l’article, avec leurs états juridiques
:* ARTICLE / BLOC_TEXTUEL / CONTENU : rédaction de cette version de l’article, au format HTML
:* ARTICLE / LIENS / (LIEN)* : liens vers ou depuis d’autres articles, du même code ou d’autres textes ; historique de l’article lorsqu’il provient d’une loi antérieure ; lien vers le texte ayant mené à la codification du texte
Pour les lois, décrets, arrêtés et autres, la structure est similaire mais généralement plus simple puisqu’il n’y a pas de sections. Les lois sont dans le dossier "legi/global/code_et_TNC_en_vigueur/TNC_en_vigueur" (abréviation de "textes non codifiés") et sont transférées dans "legi/global/code_et_TNC_non_vigueur/TNC_non_vigueur" lorsqu’elles ne sont plus en vigueur (probablement comme les codes, mais ceux-ci ont une durée de vie longue).
L’espace de noms "JORFTEXT" est plus difficile à explorer : il est étalé sur les sections TNC_en_vigueur et TNC_non_vigueur, il peut contenir des objets de l’espace de noms LEGITEXT. Le sous-dossier "texte/version" peut alors contenir un ou plusieurs fichiers LEGITEXT.
[[Catégorie:Archéo Lex]]
f5cca9d720d3d627d122d04d9bee1a7af3d2faf6
Fichier:BDD Archéo Lex 2.1.svg
6
15
67
50
2015-01-14T14:09:53Z
Seb35
1
màj
wikitext
text/x-wiki
Licence WTFPL 2.0
Version BDD : 2.1
a765e8e892d982528dbac3605dedd8bdb54963f6
68
67
2015-01-14T14:10:39Z
Seb35
1
Seb35 a importé une nouvelle version de « [[Fichier:BDD Archéo Lex 2.0.svg]] »
wikitext
text/x-wiki
Licence WTFPL 2.0
Version BDD : 2.1
a765e8e892d982528dbac3605dedd8bdb54963f6
69
68
2015-01-14T14:11:57Z
Seb35
1
Seb35 a déplacé la page [[Fichier:BDD Archéo Lex 2.0.svg]] vers [[Fichier:BDD Archéo Lex 2.1.svg]]
wikitext
text/x-wiki
Licence WTFPL 2.0
Version BDD : 2.1
a765e8e892d982528dbac3605dedd8bdb54963f6
Fichier:BDD Archéo Lex 2.0.svg
6
18
70
2015-01-14T14:11:57Z
Seb35
1
Seb35 a déplacé la page [[Fichier:BDD Archéo Lex 2.0.svg]] vers [[Fichier:BDD Archéo Lex 2.1.svg]]
wikitext
text/x-wiki
#REDIRECTION [[Fichier:BDD Archéo Lex 2.1.svg]]
c9ab073440f25ac572fc58f00d288a3db24fa984
Accueil
0
1
71
28
2015-01-29T11:58:29Z
Seb35
1
intro
wikitext
text/x-wiki
Ce wiki me sert de base de connaissance dans le cadre des activités de [[:seb35:|mon entreprise]].
Il peut comporter des pages de contenu ou simplement des liens vers d’autres sites pour les activités collaboratives. Vous pouvez vous créer un compte si vous voulez discuter ou modifier une erreur.
== Pages du wiki ==
{{Special:Allpages}}
ee4799a788b5b993c4b636ef4c51dc3eaec13bef
93
71
2015-02-11T16:25:37Z
Seb35
1
présentation des pages
wikitext
text/x-wiki
Ce wiki me sert de base de connaissance dans le cadre des activités de [[:seb35:|mon entreprise]].
Il peut comporter des pages de contenu ou simplement des liens vers d’autres sites pour les activités collaboratives. Vous pouvez vous créer un compte si vous voulez discuter ou modifier une erreur.
== Pages du wiki ==
=== Tutoriaux ===
{{Special:Allpages/Tutorial:}}
=== Autres ===
* [[Archéo Lex]]
* [[Syntaxes de formatage léger]]
2730cbd8d24397d1c9e7c70dba584b316ff08613
Tutorial:Beautiful MediaWiki URLs
102
178
72
27
2015-02-11T15:07:06Z
Seb35
1
Seb35 a déplacé la page [[Learning:Beautiful MediaWiki URLs]] vers [[Tutorial:Beautiful MediaWiki URLs]] : plus propre
wikitext
text/x-wiki
This page is about configurating beautiful and pure URLs for MediaWiki, basically without any visible "index.php". For example:
<div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;">
:{{SERVER}}/Learning:Beautiful_MediaWiki_URLs?action=edit
''instead of''
:{{SERVER}}/index.php?title=Learning:Beautiful_MediaWiki_URLs&action=edit
</div>
and it is even better in languages with non-latin alphabets:
<div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;">
:{{SERVER}}/维基百科?action=history
''instead of''
:{{SERVER}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history
</div>
== Rationale and introduction ==
The reasoning behind this is: The syntax "index.php" is not interesting from the user’s point of view so it shouldn’t be there; additionally the user should (want) to see understandable page names instead of %-encoded nonsense.
You can see on this wiki these rules in action. Technically, these ugly URLs come from good’ ol’ time’ of [[:enwikipedia:Common Gateway Interface|CGI scripts]] (ten years ago), but now —and since some time— it is possible to rewrite URLs on the server, added to the fact that all recent browsers display URLs with characters instead of %-encoded URLs, but still not in the parameters of the URL after the "?". So it’s time to remove this "index.php".
To reconciliate MediaWiki URLs with recent browsers, we take advantage of the "path info" capability offered by servers (here nginx) and we configure MediaWiki such that it vastly limit the rendering of ugly URLs.
== Prerequisites ==
* [https://www.mediawiki.org MediaWiki], installed in the directory, say, '/var/www/mediawiki'
* [http://nginx.com nginx], preferably with the module Lua (package nginx-extras in Debian/Ubuntu)
* The wiki is assumed to be installed on "<nowiki>http://wiki.example.org/</nowiki>"
* The server must support the PATH_INFO directive; it is the case for most "nginx + PHP gateway" but you should really check it works before continuing, see [https://www.mediawiki.org/Special:MyLanguage/Manual:$wgUsePathInfo Manual:$wgUsePathInfo] on MediaWiki.org.
== MediaWiki configuration ==
It is assumed the wiki is directly served from the server root location instead of a subdirectory (e.g. <nowiki>"https://example.org/" instead of "https://example.org/tools/mywiki/"</nowiki>). In other words, the "root" directive in the nginx server is the directory itself where is installed MediaWiki (where index.php is).
The following configuration variables must be added at the end of the file LocalSettings.php, in MediaWiki directory.
1. Remove the "script path" to remove all web-visible subdirectories. This should be done accordingly with nginx configuration, or it could break the installed website.
$wgScriptPath = <nowiki>''</nowiki>;
2. Set the article path to its simplest form. With this, links leading to the 'view' action of the pages will be beautiful, instead of using "index.php". The server should support the "path info" capability —it’s the case of nginx.
$wgArticlePath = '/$1';
3. Now, true improvements begin. When you view an article, the URL is beautiful, but it becomes again ugly when you edit an article or ask its printable form. So let’s remove the "index.php".
$wgScript = <nowiki>''</nowiki>;
4. The links for the actions now have the form "/Main_Page?title=Main_Page&action=edit" for the edit action. There is still the "title=" parameter which should be removed since it is already displayed in the main part of the URL. To achieve that, we have to add a small hook in LocalSettings.php to remove the "title=" parameter.
$wgHooks['GetLocalURL::Internal'][] = 'phpAgnosticURL';
function phpAgnosticURL( $title, &$url, $query ) {
global $wgArticlePath;
$url = str_replace( '$1', wfUrlencode( $title->getPrefixedDBkey() ), $wgArticlePath );
while ( preg_match( '/^(.*&|)title=([^&]*)(&.*|)$/', $query, $matches ) ) {
$query = $matches[1] . $matches[3];
}
if ( $query != <nowiki>''</nowiki> ) {
$url = wfAppendQuery( $url, $query );
}
}
Basically, MediaWiki now generates beautiful URLs but nginx no more understand the URLs where there is no "title=" parameter. In the next part, we will retablish the functioning, we will completely hide the PHP system files (this improves security), and by the way permit the creation of page with almost all possible titles (e.g. you will be able to create the page "Index.php" on the wiki; it is probably useless^^, but perhaps you can be interested by titles "Skins/…").
== Nginx configuration ==
5. The basic skeleton is just below. 'location' directives will be added in the following.
server {
listen 80;
listen 443 ssl;
server_name wiki.example.org;
root /var/www/mediawiki;
# 'location' directives to be added thereafter
}
6. First, let’s add simple things: backend PHP scripts. We don’t search to hide them, they are backend so not viewed by human users, but machines must have access to these scripts.
location ~ ^/(api|load|opensearch_desc)\.php$ {
include php5-fpm.conf;
}
7. Next, the more important thing: the call to the hidden "index.php" to catch all actions and transmit them to MediaWiki. This use the PATH_INFO parameter of CGI scripts. Additionally, we add an exception for the situation where there is still a parameter "title="; it’s the case in MediaWiki forms (Special:Recentchanges, Special:Log, etc.) and it will make the whole system both backward-compatible and with beautiful URLs (a permanent redirect from the old URLs to the new URLs). The Lua rewriting part was done thanks to an [http://forum.nginx.org/read.php?2,243462,243464 agentzh’s message] (thanks!).
location / {
if ($arg_title != <nowiki>''</nowiki>) {
set_by_lua $mwredirect '
local args = ngx.var.args
local arg_title = ngx.var.arg_title
arg_title = ngx.re.gsub(arg_title, "%3A", ":")
arg_title = ngx.re.gsub(arg_title, "%20", "_")
arg_title = ngx.re.gsub(arg_title, "[+]", "_")
local url = "/" .. arg_title
newargs, n, err = ngx.re.gsub(args, [[\btitle=[^&]*&?]], "", "jo")
if string.len(newargs) > 0 then
url = url .. "?" ..newargs
end
if string.sub(url, -1) == "&" then
url = string.sub(url, 1, -2)
end
return url
';
return 301 $mwredirect;
}
include php5-fpm.conf;
fastcgi_split_path_info ^(/)(.*)$;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
8. Now, you should have a quite functional wiki, apart some missing images. Let’s add the UI images from the /skins subdirectory and the /extensions subdirectory at the same time (some extensions have JavaScript files or image files in their directories). Here are only allowed: the images, the JS files, the CSS and LESS files, and the .htc files (used by IE).
location ~ ^/(extensions|skins)/ {
location ~ \.(js|css|htc|less|png|svg|gif|jpg|xcf)$ {
allow all;
try_files $uri =403;
}
deny all;
}
9. Now we can allow integrated files of the /images subdirectory. Below are two variants depending if your wiki is public or private.
location ~ ^/images/ {
# Publicly accessible files
location ~ ^/images/(\.htaccess|README|lockdir.*)$ {
return 404;
}
location ~ /$ {
deny all;
}
try_files $uri =404;
# Private files for a private wiki
#include php5-fpm.conf;
#fastcgi_split_path_info ^(/images/)(.*)$;
#fastcgi_param SCRIPT_FILENAME $document_root/img_auth.php;
#fastcgi_param PATH_INFO $fastcgi_path_info;
}
10. To finish, we can add /robots.txt and /favicon.ico.
location ~ ^/(robots.txt|favicon.ico)$ {
try_files $uri =404;
}
== Complements ==
a. If you cannot install the Lua module in nginx, directly-entered old URLs (coming from external places like emails, other websites, user bookmarks, etc.) will work but will be displayed as old URLs ("/index.php?title=Main_Page&action=edit"). Once the user click on some link on the wiki, s/he will see new URLs.
b. To avoid MediaWiki to create URLs with remaining "title=" parameters, MediaWiki core should be patched in many places: in all forms where there is a <nowiki><input type="hidden" name="title" … /></nowiki> HTML tag and possibly in other places. Possibly some bug should be created, at least to give an option to natively create beautiful URLs.
c. MediaWiki update maintenance: nothing from the MediaWiki configuration side, apart if you modify MediaWiki core (it is not recommanded to facilitate updates). Probably the changed configuration parameters will stay backward-compatible for some long time since most were introduced in pre 1.1.0 MediaWiki versions. Possibly some PHP scripts must be added in the point 6 in future MediaWiki releases, see the entry points in your Special:Version page or on [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org. Possibly you can want to change the files enumerated in point 9 (this list is better from a security point of view, but this requires maintenance over time).
d. The nginx configuration above was done with strict security considerations in order to remove all entry points to system files, but this requires maintenance over time. You can want to soften these security checks:
# add more PHP scripts in point 6, see [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org
# add more media files extensions in point 8, or even acess all files in the "extensions" and "skins" subdirectories, or at the contrary blacklist some file extensions (e.g. mainly .php files)
# remove the list of files in point 9, this is probably harmless from a security point of view
e. The list in point 10 could be changed depending of specific needs. For example, you could change the location of the favicon (see [https://www.mediawiki.org/wiki/Manual:$wgFavicon $wgFavicon]), or you can add a file /sitemap.xml, etc. Additionally some MediaWiki extensions or core features propose to manage some "metadata system files" like /robots.txt or /sitemap.xml; if you want to use these features, you could have to create other "location" in nginx configuration with some wrapper to PHP file, similarly to the wrapper for "/images/" in the case of a private wiki.
f. As of MediaWiki 1.23, the entry points on the page Special:Version will show "[ ]" for "index.php", this can be considered a ''bug'': the case where "index.php" is completely removed is not expected :)
== Conclusion ==
# Now the URLs are "/Main_Page", "/Main_Page?action=history", "/Main_Page?printable=yes", etc.
# Non-latin alphabets benefit of the "real characters" rendering of the browser in the URL
# The system is backward-compatible with existing URLs, and old URLs are rewritten if you have installed the Lua part in the nginx configuration.
# Your articles can have a wide range of titles and are not limited by system files, e.g. you can write articles about "Robots.txt", "Images", "Skins", or "Index.php" (NB: the initial capital).
# Except whitelisted system files and subdirectories, nobody can access to the underlying system files: e.g. "includes/Title.php" is considered as an article, as well as "LocalSettings.php", hence an attacker does not have a direct access to the system files and s/he will have to deal with MediaWiki before attacking PHP files.
9850067e9de9dce5badf5078964cb00619f2f54e
75
72
2015-02-11T15:22:08Z
Seb35
1
+tutorial template
wikitext
text/x-wiki
{{Tutorial|lang=en|status=stable}}
This page is about configurating beautiful and pure URLs for MediaWiki, basically without any visible "index.php". For example:
<div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;">
:{{SERVER}}/Learning:Beautiful_MediaWiki_URLs?action=edit
''instead of''
:{{SERVER}}/index.php?title=Learning:Beautiful_MediaWiki_URLs&action=edit
</div>
and it is even better in languages with non-latin alphabets:
<div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;">
:{{SERVER}}/维基百科?action=history
''instead of''
:{{SERVER}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history
</div>
== Rationale and introduction ==
The reasoning behind this is: The syntax "index.php" is not interesting from the user’s point of view so it shouldn’t be there; additionally the user should (want) to see understandable page names instead of %-encoded nonsense.
You can see on this wiki these rules in action. Technically, these ugly URLs come from good’ ol’ time’ of [[:enwikipedia:Common Gateway Interface|CGI scripts]] (ten years ago), but now —and since some time— it is possible to rewrite URLs on the server, added to the fact that all recent browsers display URLs with characters instead of %-encoded URLs, but still not in the parameters of the URL after the "?". So it’s time to remove this "index.php".
To reconciliate MediaWiki URLs with recent browsers, we take advantage of the "path info" capability offered by servers (here nginx) and we configure MediaWiki such that it vastly limit the rendering of ugly URLs.
== Prerequisites ==
* [https://www.mediawiki.org MediaWiki], installed in the directory, say, '/var/www/mediawiki'
* [http://nginx.com nginx], preferably with the module Lua (package nginx-extras in Debian/Ubuntu)
* The wiki is assumed to be installed on "<nowiki>http://wiki.example.org/</nowiki>"
* The server must support the PATH_INFO directive; it is the case for most "nginx + PHP gateway" but you should really check it works before continuing, see [https://www.mediawiki.org/Special:MyLanguage/Manual:$wgUsePathInfo Manual:$wgUsePathInfo] on MediaWiki.org.
== MediaWiki configuration ==
It is assumed the wiki is directly served from the server root location instead of a subdirectory (e.g. <nowiki>"https://example.org/" instead of "https://example.org/tools/mywiki/"</nowiki>). In other words, the "root" directive in the nginx server is the directory itself where is installed MediaWiki (where index.php is).
The following configuration variables must be added at the end of the file LocalSettings.php, in MediaWiki directory.
1. Remove the "script path" to remove all web-visible subdirectories. This should be done accordingly with nginx configuration, or it could break the installed website.
$wgScriptPath = <nowiki>''</nowiki>;
2. Set the article path to its simplest form. With this, links leading to the 'view' action of the pages will be beautiful, instead of using "index.php". The server should support the "path info" capability —it’s the case of nginx.
$wgArticlePath = '/$1';
3. Now, true improvements begin. When you view an article, the URL is beautiful, but it becomes again ugly when you edit an article or ask its printable form. So let’s remove the "index.php".
$wgScript = <nowiki>''</nowiki>;
4. The links for the actions now have the form "/Main_Page?title=Main_Page&action=edit" for the edit action. There is still the "title=" parameter which should be removed since it is already displayed in the main part of the URL. To achieve that, we have to add a small hook in LocalSettings.php to remove the "title=" parameter.
$wgHooks['GetLocalURL::Internal'][] = 'phpAgnosticURL';
function phpAgnosticURL( $title, &$url, $query ) {
global $wgArticlePath;
$url = str_replace( '$1', wfUrlencode( $title->getPrefixedDBkey() ), $wgArticlePath );
while ( preg_match( '/^(.*&|)title=([^&]*)(&.*|)$/', $query, $matches ) ) {
$query = $matches[1] . $matches[3];
}
if ( $query != <nowiki>''</nowiki> ) {
$url = wfAppendQuery( $url, $query );
}
}
Basically, MediaWiki now generates beautiful URLs but nginx no more understand the URLs where there is no "title=" parameter. In the next part, we will retablish the functioning, we will completely hide the PHP system files (this improves security), and by the way permit the creation of page with almost all possible titles (e.g. you will be able to create the page "Index.php" on the wiki; it is probably useless^^, but perhaps you can be interested by titles "Skins/…").
== Nginx configuration ==
5. The basic skeleton is just below. 'location' directives will be added in the following.
server {
listen 80;
listen 443 ssl;
server_name wiki.example.org;
root /var/www/mediawiki;
# 'location' directives to be added thereafter
}
6. First, let’s add simple things: backend PHP scripts. We don’t search to hide them, they are backend so not viewed by human users, but machines must have access to these scripts.
location ~ ^/(api|load|opensearch_desc)\.php$ {
include php5-fpm.conf;
}
7. Next, the more important thing: the call to the hidden "index.php" to catch all actions and transmit them to MediaWiki. This use the PATH_INFO parameter of CGI scripts. Additionally, we add an exception for the situation where there is still a parameter "title="; it’s the case in MediaWiki forms (Special:Recentchanges, Special:Log, etc.) and it will make the whole system both backward-compatible and with beautiful URLs (a permanent redirect from the old URLs to the new URLs). The Lua rewriting part was done thanks to an [http://forum.nginx.org/read.php?2,243462,243464 agentzh’s message] (thanks!).
location / {
if ($arg_title != <nowiki>''</nowiki>) {
set_by_lua $mwredirect '
local args = ngx.var.args
local arg_title = ngx.var.arg_title
arg_title = ngx.re.gsub(arg_title, "%3A", ":")
arg_title = ngx.re.gsub(arg_title, "%20", "_")
arg_title = ngx.re.gsub(arg_title, "[+]", "_")
local url = "/" .. arg_title
newargs, n, err = ngx.re.gsub(args, [[\btitle=[^&]*&?]], "", "jo")
if string.len(newargs) > 0 then
url = url .. "?" ..newargs
end
if string.sub(url, -1) == "&" then
url = string.sub(url, 1, -2)
end
return url
';
return 301 $mwredirect;
}
include php5-fpm.conf;
fastcgi_split_path_info ^(/)(.*)$;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
8. Now, you should have a quite functional wiki, apart some missing images. Let’s add the UI images from the /skins subdirectory and the /extensions subdirectory at the same time (some extensions have JavaScript files or image files in their directories). Here are only allowed: the images, the JS files, the CSS and LESS files, and the .htc files (used by IE).
location ~ ^/(extensions|skins)/ {
location ~ \.(js|css|htc|less|png|svg|gif|jpg|xcf)$ {
allow all;
try_files $uri =403;
}
deny all;
}
9. Now we can allow integrated files of the /images subdirectory. Below are two variants depending if your wiki is public or private.
location ~ ^/images/ {
# Publicly accessible files
location ~ ^/images/(\.htaccess|README|lockdir.*)$ {
return 404;
}
location ~ /$ {
deny all;
}
try_files $uri =404;
# Private files for a private wiki
#include php5-fpm.conf;
#fastcgi_split_path_info ^(/images/)(.*)$;
#fastcgi_param SCRIPT_FILENAME $document_root/img_auth.php;
#fastcgi_param PATH_INFO $fastcgi_path_info;
}
10. To finish, we can add /robots.txt and /favicon.ico.
location ~ ^/(robots.txt|favicon.ico)$ {
try_files $uri =404;
}
== Complements ==
a. If you cannot install the Lua module in nginx, directly-entered old URLs (coming from external places like emails, other websites, user bookmarks, etc.) will work but will be displayed as old URLs ("/index.php?title=Main_Page&action=edit"). Once the user click on some link on the wiki, s/he will see new URLs.
b. To avoid MediaWiki to create URLs with remaining "title=" parameters, MediaWiki core should be patched in many places: in all forms where there is a <nowiki><input type="hidden" name="title" … /></nowiki> HTML tag and possibly in other places. Possibly some bug should be created, at least to give an option to natively create beautiful URLs.
c. MediaWiki update maintenance: nothing from the MediaWiki configuration side, apart if you modify MediaWiki core (it is not recommanded to facilitate updates). Probably the changed configuration parameters will stay backward-compatible for some long time since most were introduced in pre 1.1.0 MediaWiki versions. Possibly some PHP scripts must be added in the point 6 in future MediaWiki releases, see the entry points in your Special:Version page or on [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org. Possibly you can want to change the files enumerated in point 9 (this list is better from a security point of view, but this requires maintenance over time).
d. The nginx configuration above was done with strict security considerations in order to remove all entry points to system files, but this requires maintenance over time. You can want to soften these security checks:
# add more PHP scripts in point 6, see [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org
# add more media files extensions in point 8, or even acess all files in the "extensions" and "skins" subdirectories, or at the contrary blacklist some file extensions (e.g. mainly .php files)
# remove the list of files in point 9, this is probably harmless from a security point of view
e. The list in point 10 could be changed depending of specific needs. For example, you could change the location of the favicon (see [https://www.mediawiki.org/wiki/Manual:$wgFavicon $wgFavicon]), or you can add a file /sitemap.xml, etc. Additionally some MediaWiki extensions or core features propose to manage some "metadata system files" like /robots.txt or /sitemap.xml; if you want to use these features, you could have to create other "location" in nginx configuration with some wrapper to PHP file, similarly to the wrapper for "/images/" in the case of a private wiki.
f. As of MediaWiki 1.23, the entry points on the page Special:Version will show "[ ]" for "index.php", this can be considered a ''bug'': the case where "index.php" is completely removed is not expected :)
== Conclusion ==
# Now the URLs are "/Main_Page", "/Main_Page?action=history", "/Main_Page?printable=yes", etc.
# Non-latin alphabets benefit of the "real characters" rendering of the browser in the URL
# The system is backward-compatible with existing URLs, and old URLs are rewritten if you have installed the Lua part in the nginx configuration.
# Your articles can have a wide range of titles and are not limited by system files, e.g. you can write articles about "Robots.txt", "Images", "Skins", or "Index.php" (NB: the initial capital).
# Except whitelisted system files and subdirectories, nobody can access to the underlying system files: e.g. "includes/Title.php" is considered as an article, as well as "LocalSettings.php", hence an attacker does not have a direct access to the system files and s/he will have to deal with MediaWiki before attacking PHP files.
1d97d05cc36e8cd4f1c056bd771ea04f78d35cf3
76
75
2015-02-11T15:55:30Z
Seb35
1
protocol-relative
wikitext
text/x-wiki
{{Tutorial|lang=en|status=stable}}
This page is about configurating beautiful and pure URLs for MediaWiki, basically without any visible "index.php". For example:
<div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;">
:[{{SERVER}}/Learning:Beautiful_MediaWiki_URLs?action=edit http://{{SERVERNAME}}/Learning:Beautiful_MediaWiki_URLs?action=edit]
''instead of''
:[{{SERVER}}/index.php?title=Learning:Beautiful_MediaWiki_URLs&action=edit http://{{SERVERNAME}}/index.php?title=Learning:Beautiful_MediaWiki_URLs&action=edit]
</div>
and it is even better in languages with non-latin alphabets:
<div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;">
:[{{SERVER}}/维基百科?action=history http://{{SERVERNAME}}/维基百科?action=history]
''instead of''
:[{{SERVER}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history http://{{SERVERNAME}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history]
</div>
== Rationale and introduction ==
The reasoning behind this is: The syntax "index.php" is not interesting from the user’s point of view so it shouldn’t be there; additionally the user should (want) to see understandable page names instead of %-encoded nonsense.
You can see on this wiki these rules in action. Technically, these ugly URLs come from good’ ol’ time’ of [[:enwikipedia:Common Gateway Interface|CGI scripts]] (ten years ago), but now —and since some time— it is possible to rewrite URLs on the server, added to the fact that all recent browsers display URLs with characters instead of %-encoded URLs, but still not in the parameters of the URL after the "?". So it’s time to remove this "index.php".
To reconciliate MediaWiki URLs with recent browsers, we take advantage of the "path info" capability offered by servers (here nginx) and we configure MediaWiki such that it vastly limit the rendering of ugly URLs.
== Prerequisites ==
* [https://www.mediawiki.org MediaWiki], installed in the directory, say, '/var/www/mediawiki'
* [http://nginx.com nginx], preferably with the module Lua (package nginx-extras in Debian/Ubuntu)
* The wiki is assumed to be installed on "<nowiki>http://wiki.example.org/</nowiki>"
* The server must support the PATH_INFO directive; it is the case for most "nginx + PHP gateway" but you should really check it works before continuing, see [https://www.mediawiki.org/Special:MyLanguage/Manual:$wgUsePathInfo Manual:$wgUsePathInfo] on MediaWiki.org.
== MediaWiki configuration ==
It is assumed the wiki is directly served from the server root location instead of a subdirectory (e.g. <nowiki>"https://example.org/" instead of "https://example.org/tools/mywiki/"</nowiki>). In other words, the "root" directive in the nginx server is the directory itself where is installed MediaWiki (where index.php is).
The following configuration variables must be added at the end of the file LocalSettings.php, in MediaWiki directory.
1. Remove the "script path" to remove all web-visible subdirectories. This should be done accordingly with nginx configuration, or it could break the installed website.
$wgScriptPath = <nowiki>''</nowiki>;
2. Set the article path to its simplest form. With this, links leading to the 'view' action of the pages will be beautiful, instead of using "index.php". The server should support the "path info" capability —it’s the case of nginx.
$wgArticlePath = '/$1';
3. Now, true improvements begin. When you view an article, the URL is beautiful, but it becomes again ugly when you edit an article or ask its printable form. So let’s remove the "index.php".
$wgScript = <nowiki>''</nowiki>;
4. The links for the actions now have the form "/Main_Page?title=Main_Page&action=edit" for the edit action. There is still the "title=" parameter which should be removed since it is already displayed in the main part of the URL. To achieve that, we have to add a small hook in LocalSettings.php to remove the "title=" parameter.
$wgHooks['GetLocalURL::Internal'][] = 'phpAgnosticURL';
function phpAgnosticURL( $title, &$url, $query ) {
global $wgArticlePath;
$url = str_replace( '$1', wfUrlencode( $title->getPrefixedDBkey() ), $wgArticlePath );
while ( preg_match( '/^(.*&|)title=([^&]*)(&.*|)$/', $query, $matches ) ) {
$query = $matches[1] . $matches[3];
}
if ( $query != <nowiki>''</nowiki> ) {
$url = wfAppendQuery( $url, $query );
}
}
Basically, MediaWiki now generates beautiful URLs but nginx no more understand the URLs where there is no "title=" parameter. In the next part, we will retablish the functioning, we will completely hide the PHP system files (this improves security), and by the way permit the creation of page with almost all possible titles (e.g. you will be able to create the page "Index.php" on the wiki; it is probably useless^^, but perhaps you can be interested by titles "Skins/…").
== Nginx configuration ==
5. The basic skeleton is just below. 'location' directives will be added in the following.
server {
listen 80;
listen 443 ssl;
server_name wiki.example.org;
root /var/www/mediawiki;
# 'location' directives to be added thereafter
}
6. First, let’s add simple things: backend PHP scripts. We don’t search to hide them, they are backend so not viewed by human users, but machines must have access to these scripts.
location ~ ^/(api|load|opensearch_desc)\.php$ {
include php5-fpm.conf;
}
7. Next, the more important thing: the call to the hidden "index.php" to catch all actions and transmit them to MediaWiki. This use the PATH_INFO parameter of CGI scripts. Additionally, we add an exception for the situation where there is still a parameter "title="; it’s the case in MediaWiki forms (Special:Recentchanges, Special:Log, etc.) and it will make the whole system both backward-compatible and with beautiful URLs (a permanent redirect from the old URLs to the new URLs). The Lua rewriting part was done thanks to an [http://forum.nginx.org/read.php?2,243462,243464 agentzh’s message] (thanks!).
location / {
if ($arg_title != <nowiki>''</nowiki>) {
set_by_lua $mwredirect '
local args = ngx.var.args
local arg_title = ngx.var.arg_title
arg_title = ngx.re.gsub(arg_title, "%3A", ":")
arg_title = ngx.re.gsub(arg_title, "%20", "_")
arg_title = ngx.re.gsub(arg_title, "[+]", "_")
local url = "/" .. arg_title
newargs, n, err = ngx.re.gsub(args, [[\btitle=[^&]*&?]], "", "jo")
if string.len(newargs) > 0 then
url = url .. "?" ..newargs
end
if string.sub(url, -1) == "&" then
url = string.sub(url, 1, -2)
end
return url
';
return 301 $mwredirect;
}
include php5-fpm.conf;
fastcgi_split_path_info ^(/)(.*)$;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
8. Now, you should have a quite functional wiki, apart some missing images. Let’s add the UI images from the /skins subdirectory and the /extensions subdirectory at the same time (some extensions have JavaScript files or image files in their directories). Here are only allowed: the images, the JS files, the CSS and LESS files, and the .htc files (used by IE).
location ~ ^/(extensions|skins)/ {
location ~ \.(js|css|htc|less|png|svg|gif|jpg|xcf)$ {
allow all;
try_files $uri =403;
}
deny all;
}
9. Now we can allow integrated files of the /images subdirectory. Below are two variants depending if your wiki is public or private.
location ~ ^/images/ {
# Publicly accessible files
location ~ ^/images/(\.htaccess|README|lockdir.*)$ {
return 404;
}
location ~ /$ {
deny all;
}
try_files $uri =404;
# Private files for a private wiki
#include php5-fpm.conf;
#fastcgi_split_path_info ^(/images/)(.*)$;
#fastcgi_param SCRIPT_FILENAME $document_root/img_auth.php;
#fastcgi_param PATH_INFO $fastcgi_path_info;
}
10. To finish, we can add /robots.txt and /favicon.ico.
location ~ ^/(robots.txt|favicon.ico)$ {
try_files $uri =404;
}
== Complements ==
a. If you cannot install the Lua module in nginx, directly-entered old URLs (coming from external places like emails, other websites, user bookmarks, etc.) will work but will be displayed as old URLs ("/index.php?title=Main_Page&action=edit"). Once the user click on some link on the wiki, s/he will see new URLs.
b. To avoid MediaWiki to create URLs with remaining "title=" parameters, MediaWiki core should be patched in many places: in all forms where there is a <nowiki><input type="hidden" name="title" … /></nowiki> HTML tag and possibly in other places. Possibly some bug should be created, at least to give an option to natively create beautiful URLs.
c. MediaWiki update maintenance: nothing from the MediaWiki configuration side, apart if you modify MediaWiki core (it is not recommanded to facilitate updates). Probably the changed configuration parameters will stay backward-compatible for some long time since most were introduced in pre 1.1.0 MediaWiki versions. Possibly some PHP scripts must be added in the point 6 in future MediaWiki releases, see the entry points in your Special:Version page or on [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org. Possibly you can want to change the files enumerated in point 9 (this list is better from a security point of view, but this requires maintenance over time).
d. The nginx configuration above was done with strict security considerations in order to remove all entry points to system files, but this requires maintenance over time. You can want to soften these security checks:
# add more PHP scripts in point 6, see [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org
# add more media files extensions in point 8, or even acess all files in the "extensions" and "skins" subdirectories, or at the contrary blacklist some file extensions (e.g. mainly .php files)
# remove the list of files in point 9, this is probably harmless from a security point of view
e. The list in point 10 could be changed depending of specific needs. For example, you could change the location of the favicon (see [https://www.mediawiki.org/wiki/Manual:$wgFavicon $wgFavicon]), or you can add a file /sitemap.xml, etc. Additionally some MediaWiki extensions or core features propose to manage some "metadata system files" like /robots.txt or /sitemap.xml; if you want to use these features, you could have to create other "location" in nginx configuration with some wrapper to PHP file, similarly to the wrapper for "/images/" in the case of a private wiki.
f. As of MediaWiki 1.23, the entry points on the page Special:Version will show "[ ]" for "index.php", this can be considered a ''bug'': the case where "index.php" is completely removed is not expected :)
== Conclusion ==
# Now the URLs are "/Main_Page", "/Main_Page?action=history", "/Main_Page?printable=yes", etc.
# Non-latin alphabets benefit of the "real characters" rendering of the browser in the URL
# The system is backward-compatible with existing URLs, and old URLs are rewritten if you have installed the Lua part in the nginx configuration.
# Your articles can have a wide range of titles and are not limited by system files, e.g. you can write articles about "Robots.txt", "Images", "Skins", or "Index.php" (NB: the initial capital).
# Except whitelisted system files and subdirectories, nobody can access to the underlying system files: e.g. "includes/Title.php" is considered as an article, as well as "LocalSettings.php", hence an attacker does not have a direct access to the system files and s/he will have to deal with MediaWiki before attacking PHP files.
8c4e450ab4221fe9867e64a5784f74da2402a854
Learning:Beautiful MediaWiki URLs
0
19
73
2015-02-11T15:07:07Z
Seb35
1
Seb35 a déplacé la page [[Learning:Beautiful MediaWiki URLs]] vers [[Tutorial:Beautiful MediaWiki URLs]] : plus propre
wikitext
text/x-wiki
#REDIRECTION [[Tutorial:Beautiful MediaWiki URLs]]
dc22f432875ad97f31b7e93b81fc5f66adfa80c9
Modèle:Tutorial
10
20
74
2015-02-11T15:20:43Z
Seb35
1
création
wikitext
text/x-wiki
<div style="top:0px; right:0px; float:right; z-index:0; background-color:white; border:1px solid black; padding: 0px 10px;">
Langue : {{{lang|fr}}}<br />
Statut : {{{status|stable}}}
</div>
65c7d3502fb90581fef7dc523ed05ad3628539f0
78
74
2015-02-11T16:00:47Z
Seb35
1
+catégories
wikitext
text/x-wiki
<div style="top:0px; right:0px; float:right; z-index:0; background-color:white; border:1px solid black; padding: 0px 10px;">
Langue : {{{lang|fr}}}<br />
Statut : {{{status|stable}}}
</div>
[[Catégorie:{{{lang|fr}}}]]
[[Catégorie:{{{status|stable}}}]]
d61c60431da77033fa2d9341a1c409c5babd232a
83
78
2015-02-11T16:14:05Z
Seb35
1
contraintes sur les paramètres
wikitext
text/x-wiki
<div style="top:0px; right:0px; float:right; z-index:0; background-color:white; border:1px solid black; padding: 0px 10px;">
Langue : {{{lang|fr}}}<br />
Statut : {{{status|stable}}}
</div>
[[Catégorie:{{#switch:{{lc:{{{lang|fr}}}}}|fr|en={{lc:{{{lang|fr}}}}}|#default=Langue inconnue}}]]
[[Catégorie:{{#switch:{{lc:{{{status|stable}}}}}|stable=Stable|draft|brouillon=Brouillon|#default=Statut inconnu}}]]
c99f3182d46f42bc39cfecce3db9e80458adf8f9
86
83
2015-02-11T16:16:30Z
Seb35
1
+includeonly, +contraintes
wikitext
text/x-wiki
<div style="top:0px; right:0px; float:right; z-index:0; background-color:white; border:1px solid black; padding: 0px 10px;">
Langue : {{#switch:{{lc:{{{lang|fr}}}}}|fr|en={{lc:{{{lang|fr}}}}}|#default=inconnue}}<br />
Statut : {{#switch:{{lc:{{{status|stable}}}}}|stable=stable|draft|brouillon=brouillon|#default=inconnu}}
</div>
<includeonly>[[Catégorie:{{#switch:{{lc:{{{lang|fr}}}}}|fr|en={{lc:{{{lang|fr}}}}}|#default=Langue inconnue}}]]
[[Catégorie:{{#switch:{{lc:{{{status|stable}}}}}|stable=Stable|draft|brouillon=Brouillon|#default=Statut inconnu}}]]</includeonly>
74b931e6dbb079e73ba71c22d5376031210c342f
Tutorial:Packaging de WebApps
102
6
77
13
2015-02-11T15:58:30Z
Seb35
1
+tutorial template
wikitext
text/x-wiki
{{Tutorial|lang=en|status=draft}}
List and comparison of various webapps packaging, with the aim at finding commonalities and differencies to create a directory structure compatible with a largest set of deployment targets. (Possibly if there are uncompatible directory structures between two deployment targets, it will be up to the developer to choose what target s/he prefers.)
== HTML5 ==
* Status: W3C Candidate Recommandation
* Specification: http://www.w3.org/TR/html5/
* Package:
** Extension:
** MIME type:
** Format:
** Manifest: *.appcache
* Cache manifest:
** Extension: .appcache
** MIME type: text/cache-manifest
** Format: text
== Packaged Web Apps (Widgets) ==
* Status: W3C Recommandation
* Specification: http://www.w3.org/TR/widgets/
* Directory structure:<table class="wikitable"><caption>Reserved File Names Table</caption><tr><th>file name</th><th>type</th><th>reserved for purpose</th></tr><tr><td>config.xml</td><td>file</td><td>Configuration document</td></tr><tr><td>icon.png</td><td>file</td><td>Default icon</td></tr><tr><td>icon.gif</td><td>file</td><td>Default icon</td></tr><tr><td>icon.jpg</td><td>file</td><td>Default icon</td></tr><tr><td>icon.ico</td><td>file</td><td>Default icon</td></tr><tr><td>icon.svg</td><td>file</td><td>Default icon</td></tr><tr><td>index.html</td><td>file</td><td>Default start file</td></tr><tr><td>index.htm</td><td>file</td><td>Default start file</td></tr><tr><td>index.svg</td><td>file</td><td>Default start file</td></tr><tr><td>index.xhtml</td><td>file</td><td>Default start file</td></tr><tr><td>index.xht</td><td>file</td><td>Default start file</td></tr><tr><td>locales</td><td>folder</td><td>Container for localized content</td></tr></table>
* Package:
** Extension: .wgt
** MIME type: application/widget
** Format: ZIP file
** Manifest: config.xml (see specification)
== Firefox OS / Firefox Apps ==
* Status: Industry specification
* Documentation: https://developer.mozilla.org/en-US/Apps/Quickstart
* Directory structure:<table class="wikitable"><caption>Reserved File Names Table</caption><tr><th>file name</th><th>type</th><th>reserved for purpose</th></tr><tr><td>manifest.webapp</td><td>file</td><td>Manifest document</td></tr><tr><td>index.html</td><td>file</td><td>Default start file</td></table>
* Package:
** Format: Web hosting or ZIP file
** Manifest: manifest.webapp (see documentation)
== Manifest for web apps and bookmarks ==
* Status: W3C Working Draft
* Working draft: http://www.w3.org/TR/appmanifest/
* Package:
** Extension: N/A
** MIME type: N/A
** Format: N/A
** Manifest: *
** Manifest fetching method: <link ref="manifest" href="..." />
* Manifest:
** Extension: .json, .manifest
** MIME type: application/manifest+json
** Format: JSON
== Opera 14- ==
* Status: Industry specification (deprecated)
* Package:
** Extension: .oex
** Format: ZIP file
== Chromium / Opera 15+ ==
* Status: Industry specification
* Documentation Opera: https://dev.opera.com/extensions/
* Package:
** Extension: .nex
** MIME type:
** Format: ZIP file
** Manifest: manifest.json
* Manifest:
** Filename: manifest.json
** Format: JSON
baab107e23ff98609c1b2aaaa08a597ef66035f1
Catégorie:Fr
14
21
79
2015-02-11T16:01:12Z
Seb35
1
création
wikitext
text/x-wiki
[[Catégorie:Langue]]
b891e1f2d696cddfc8b45c4992ed05a536321d5e
Catégorie:Langue
14
22
80
2015-02-11T16:01:35Z
Seb35
1
création
wikitext
text/x-wiki
[[Catégorie:Racine]]
129a48f152ec5efbe3262fb58ee49b7b04112cb5
Catégorie:Racine
14
23
81
2015-02-11T16:02:05Z
Seb35
1
création
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
Catégorie:Stable
14
24
82
2015-02-11T16:02:45Z
Seb35
1
création
wikitext
text/x-wiki
[[Catégorie:Statut]]
822454b11ccb84c6db15f0da0be54f72777ec760
Catégorie:Statut
14
25
84
2015-02-11T16:14:31Z
Seb35
1
création
wikitext
text/x-wiki
[[Catégorie:Racine]]
129a48f152ec5efbe3262fb58ee49b7b04112cb5
Catégorie:Brouillon
14
26
85
2015-02-11T16:14:51Z
Seb35
1
création
wikitext
text/x-wiki
[[Catégorie:Statut]]
822454b11ccb84c6db15f0da0be54f72777ec760
Catégorie:En
14
27
87
2015-02-11T16:17:03Z
Seb35
1
création
wikitext
text/x-wiki
[[Catégorie:Langue]]
b891e1f2d696cddfc8b45c4992ed05a536321d5e
Modèle:Transféré
10
28
88
2015-02-11T16:20:00Z
Seb35
1
création du modèle
wikitext
text/x-wiki
<div align="center"><div style="background-color:#aeff00;border:2px solid #54ff00;opacity:0.8;padding:5px;display:inline-block;">Déplacé sur {{{1}}}</div></div>
c9689219235260b5834084056d22e738d544ddcd
Log/Seb35
0
29
94
2015-02-19T10:59:12Z
Seb35
1
log en français et anglais de mon activité sur MediaWiki
wikitext
text/x-wiki
{{log|user=Seb35|date=2015-02-14|site=mediawiki.org|page=Category:MediaWiki version information templates|type=edition|oldid=1409751|comment-fr=lisibilité améliorée du tableau des versions en cours|comment-en=improved readibility of the current versions table}}
{{log|user=Seb35|date=2015-02-14|site=mediawiki.org|page=Download/fr|type=translation-update|oldid=1409804}}
{{log|user=Seb35|date=2015-02-15|site=mediawiki.org|page=Release notes/data|type=edition|comment-fr=recensement des métadonnées autour des versions de MediaWiki|comment-en=census of the metadata around MediaWiki versions|oldid=1410218}}
{{log|user=Seb35|date=2015-02-15|site=mediawiki.org|page=Template:Timeline MediaWiki|type=edition|comment-fr=mise à jour et correction de la frise chronologique des versions de MediaWiki|comment-en=updated et corrected the MediaWiki versions timeline|oldid=1410930}}
<!--
{{log|user=Seb35|date=2015--|site=mediawiki.org|page=|type=edition|comment-fr=|comment-en=|}}
-->
32e6c9bfc32590200bac789ccaeb01eba5aa82ae
MediaWiki:Lang
8
30
95
2015-02-19T11:16:17Z
Seb35
1
lang
wikitext
text/x-wiki
fr
b858a87c07b04c4568f51b0dce655f78d73c02b3
MediaWiki:Lang/en
8
31
96
2015-02-19T11:16:33Z
Seb35
1
Page créée avec « en »
wikitext
text/x-wiki
en
094b0fe0e302854af1311afab85b5203ba457a3b
Modèle:Log
10
32
97
2015-02-19T11:23:11Z
Seb35
1
création
wikitext
text/x-wiki
* {{#date:d F Y|{{{date}}}}} {{#ifeq:{{lc:{{{site|}}}}}|mediawiki.org|[MW.org] {{#if:{{{oldid|}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki/{{{page}}}?oldid={{{oldid}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|[{{{site}}}] [{{{site}}}{{{uri}}} {{{uri}}}]}}}} {{#ifeq|{{int:lang}}|en|{{#if:{{{comment-en|}}}|{{{comment-en}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}
b90aa840c5d6349c03e05a918f83955d04c5a81c
98
97
2015-02-19T11:24:27Z
Seb35
1
syntaxe
wikitext
text/x-wiki
* {{#date:d F Y|{{{date}}}}} {{#ifeq:{{lc:{{{site|}}}}}|mediawiki.org|[MW.org] {{#if:{{{oldid|}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki/{{{page}}}?oldid={{{oldid}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|[{{{site}}}] [{{{site}}}{{{uri}}} {{{uri}}}]}}}} {{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}
055f17ea91003bc25e677ddc97b2c2e595c140bb
99
98
2015-02-19T11:30:00Z
Seb35
1
syntaxe
wikitext
text/x-wiki
* {{#date:d F Y|{{{date}}}}} {{#ifeq:{{lc:{{{site|}}}}}|mediawiki.org|[MW.org] {{#if:{{{oldid}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki{{localurl:{{{page}}}|oldid={{{oldid}}}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|[{{{site}}}] [{{{site}}}{{urlencode:{{{uri}}}}} {{{uri}}}]}}}} {{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}
68888d05d2c389af87161b06696278ffa1ad3bc4
100
99
2015-02-19T11:32:31Z
Seb35
1
syntaxe
wikitext
text/x-wiki
* {{#date:d F Y|{{{date}}}}} {{#ifeq:{{lc:{{{site|}}}}}|mediawiki.org|[MW.org] {{#if:{{{oldid}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki{{localurl:{{{page}}}|oldid={{{oldid}}}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|[{{{site}}}] [{{{site}}}{{urlencode:{{{uri}}}}} {{{uri}}}]}} {{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}
904f4dcd9b6e780423360b1e153672ba8d9300b2
Modèle:Log
10
32
101
100
2015-02-19T11:33:34Z
Seb35
1
syntaxe
wikitext
text/x-wiki
* {{#time:d F Y|{{{date}}}}} {{#ifeq:{{lc:{{{site|}}}}}|mediawiki.org|[MW.org] {{#if:{{{oldid}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki{{localurl:{{{page}}}|oldid={{{oldid}}}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|[{{{site}}}] [{{{site}}}{{urlencode:{{{uri}}}}} {{{uri}}}]}} {{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}
8d5ef98430596ff36abf00124a41639f38d43660
102
101
2015-02-19T11:35:44Z
Seb35
1
date en anglais si besoin
wikitext
text/x-wiki
* {{#ifeq:{{int:lang}}|en|{{#time:F d, Y|{{{date}}}}}:|{{#time:d F Y|{{{date}}}}} :}} {{#ifeq:{{lc:{{{site|}}}}}|mediawiki.org|[MW.org] {{#if:{{{oldid}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki{{localurl:{{{page}}}|oldid={{{oldid}}}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|[{{{site}}}] [{{{site}}}{{urlencode:{{{uri}}}}} {{{uri}}}]}} {{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}
c1dbea8f7da7a3ca486575d8257f047b61d19fb0
103
102
2015-02-19T11:36:29Z
Seb35
1
re
wikitext
text/x-wiki
* {{#ifeq:{{int:lang}}|en|{{#time:F d, Y|{{{date}}}|en}}:|{{#time:d F Y|{{{date}}}}} :}} {{#ifeq:{{lc:{{{site|}}}}}|mediawiki.org|[MW.org] {{#if:{{{oldid}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki{{localurl:{{{page}}}|oldid={{{oldid}}}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|[{{{site}}}] [{{{site}}}{{urlencode:{{{uri}}}}} {{{uri}}}]}} {{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}
51d3a1d95c0910b5cc8cecac5208bab597d6a1b4
104
103
2015-02-19T11:40:04Z
Seb35
1
+type=translation +type=translation-update
wikitext
text/x-wiki
* {{#ifeq:{{int:lang}}|en|{{#time:F d, Y|{{{date}}}|en}}:|{{#time:d F Y|{{{date}}}}} :}} {{#ifeq:{{lc:{{{site|}}}}}|mediawiki.org|[MW.org] {{#if:{{{oldid}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki{{localurl:{{{page}}}|oldid={{{oldid}}}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|[{{{site}}}] [{{{site}}}{{urlencode:{{{uri}}}}} {{{uri}}}]}} {{#switch:translation={{#ifeq:{{int:lang}}|en|(''translation'')|(''traduction'')}}|translation-update={{#ifeq:{{int:lang}}|en|(''updated translation'')|(''mise à jour de la traduction'')}}|edition|#default={{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}}}
60d37229e279f19a113d6d9e274b676ebbf15229
105
104
2015-02-19T11:40:52Z
Seb35
1
syntaxe
wikitext
text/x-wiki
* {{#ifeq:{{int:lang}}|en|{{#time:F d, Y|{{{date}}}|en}}:|{{#time:d F Y|{{{date}}}}} :}} {{#ifeq:{{lc:{{{site|}}}}}|mediawiki.org|[MW.org] {{#if:{{{oldid}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki{{localurl:{{{page}}}|oldid={{{oldid}}}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|[{{{site}}}] [{{{site}}}{{urlencode:{{{uri}}}}} {{{uri}}}]}} {{#switch:{{{type|edition}}}|translation={{#ifeq:{{int:lang}}|en|(''translation'')|(''traduction'')}}|translation-update={{#ifeq:{{int:lang}}|en|(''updated translation'')|(''mise à jour de la traduction'')}}|edition|#default={{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}}}
444f84b6cdd6610600d7134b0ba17e37622f018b
107
105
2015-02-19T11:51:57Z
Seb35
1
+type=(sans type) pour commentaire brut
wikitext
text/x-wiki
* {{#ifeq:{{int:lang}}|en|{{#time:F d, Y|{{{date}}}|en}}:|{{#time:d F Y|{{{date}}}}} :}} {{#switch:{{lc:{{{site|}}}}}|mediawiki.org=[MW.org] {{#if:{{{oldid}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki{{localurl:{{{page}}}|oldid={{{oldid}}}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|{{id:{{{site|}}}:[{{{site}}}] [{{{site}}}{{urlencode:{{{uri}}}}} {{{uri}}}]}}}} {{#switch:{{{type|edition}}}|translation={{#ifeq:{{int:lang}}|en|(''translation'')|(''traduction'')}}|translation-update={{#ifeq:{{int:lang}}|en|(''updated translation'')|(''mise à jour de la traduction'')}}|edition={{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|#default={{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|{{{comment-en}}}|{{{comment-fr|}}}}}|{{{comment-fr|}}}}}}}
cdd32275c16b893e7ab319a5292984c8c55e0344
108
107
2015-02-19T11:55:44Z
Seb35
1
+type=comment (=sans type)
wikitext
text/x-wiki
* {{#ifeq:{{int:lang}}|en|{{#time:F d, Y|{{{date}}}|en}}:|{{#time:d F Y|{{{date}}}}} :}} {{#switch:{{lc:{{{site|}}}}}|mediawiki.org=[MW.org] {{#if:{{{oldid}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki{{localurl:{{{page}}}|oldid={{{oldid}}}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|{{id:{{{site|}}}:[{{{site}}}] [{{{site}}}{{urlencode:{{{uri}}}}} {{{uri}}}]}}}} {{#switch:{{{type|edition}}}|translation={{#ifeq:{{int:lang}}|en|(''translation'')|(''traduction'')}}|translation-update={{#ifeq:{{int:lang}}|en|(''updated translation'')|(''mise à jour de la traduction'')}}|edition={{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|comment|#default={{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|{{{comment-en}}}|{{{comment-fr|}}}}}|{{{comment-fr|}}}}}}}
b706ad537d60346ab61c44e0fc73ec7566c5c833
109
108
2015-02-19T11:57:31Z
Seb35
1
syntaxe
wikitext
text/x-wiki
* {{#ifeq:{{int:lang}}|en|{{#time:F d, Y|{{{date}}}|en}}:|{{#time:d F Y|{{{date}}}}} :}} {{#switch:{{lc:{{{site|}}}}}|mediawiki.org=[MW.org] {{#if:{{{oldid}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki{{localurl:{{{page}}}|oldid={{{oldid}}}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|{{if:{{{site|}}}:[{{{site}}}] [{{{site}}}{{urlencode:{{{uri}}}}} {{{uri}}}]}}}} {{#switch:{{{type|edition}}}|translation={{#ifeq:{{int:lang}}|en|(''translation'')|(''traduction'')}}|translation-update={{#ifeq:{{int:lang}}|en|(''updated translation'')|(''mise à jour de la traduction'')}}|edition={{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|comment|#default={{lcfirst:{{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|{{{comment-en}}}|{{{comment-fr|}}}}}|{{{comment-fr|}}}}}}}}}
0e104df5dc894fa30c399cdb98807f882bdaa3fc
110
109
2015-02-19T11:58:39Z
Seb35
1
syntaxe
wikitext
text/x-wiki
* {{#ifeq:{{int:lang}}|en|{{#time:F d, Y|{{{date}}}|en}}:|{{#time:d F Y|{{{date}}}}} :}} {{#switch:{{lc:{{{site|}}}}}|mediawiki.org=[MW.org] {{#if:{{{oldid}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki{{localurl:{{{page}}}|oldid={{{oldid}}}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|{{if:{{{site|}}}|[{{{site}}}] [{{{site}}}{{urlencode:{{{uri}}}}} {{{uri}}}]}}}} {{#switch:{{{type|edition}}}|translation={{#ifeq:{{int:lang}}|en|(''translation'')|(''traduction'')}}|translation-update={{#ifeq:{{int:lang}}|en|(''updated translation'')|(''mise à jour de la traduction'')}}|edition={{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|comment|#default={{lcfirst:{{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|{{{comment-en}}}|{{{comment-fr|}}}}}|{{{comment-fr|}}}}}}}}}
a6eb2c3fd2bbfe8abc4395ce46533a4ba3a283dd
111
110
2015-02-19T11:59:13Z
Seb35
1
syntaxe
wikitext
text/x-wiki
* {{#ifeq:{{int:lang}}|en|{{#time:F d, Y|{{{date}}}|en}}:|{{#time:d F Y|{{{date}}}}} :}} {{#switch:{{lc:{{{site|}}}}}|mediawiki.org=[MW.org] {{#if:{{{oldid}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki{{localurl:{{{page}}}|oldid={{{oldid}}}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|{{#if:{{{site|}}}|[{{{site}}}] [{{{site}}}{{urlencode:{{{uri}}}}} {{{uri}}}]}}}} {{#switch:{{{type|edition}}}|translation={{#ifeq:{{int:lang}}|en|(''translation'')|(''traduction'')}}|translation-update={{#ifeq:{{int:lang}}|en|(''updated translation'')|(''mise à jour de la traduction'')}}|edition={{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|comment|#default={{lcfirst:{{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|{{{comment-en}}}|{{{comment-fr|}}}}}|{{{comment-fr|}}}}}}}}}
50e035692c5f5c9e80e0405430cc449802e1bb2d
112
111
2015-02-19T11:59:50Z
Seb35
1
typo
wikitext
text/x-wiki
* {{#ifeq:{{int:lang}}|en|{{#time:F d, Y|{{{date}}}|en}}:|{{#time:d F Y|{{{date}}}}} :}} {{#switch:{{lc:{{{site|}}}}}|mediawiki.org=[MW.org] {{#if:{{{oldid}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki{{localurl:{{{page}}}|oldid={{{oldid}}}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|{{#if:{{{site|}}}|[{{{site}}}] [{{{site}}}{{urlencode:{{{uri}}}}} {{{uri}}}]}}}} {{#switch:{{{type|edition}}}|translation={{#ifeq:{{int:lang}}|en|(''translation'')|(''traduction'')}}|translation-update={{#ifeq:{{int:lang}}|en|(''updated translation'')|(''mise à jour de la traduction'')}}|edition={{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|comment|#default={{ucfirst:{{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|{{{comment-en}}}|{{{comment-fr|}}}}}|{{{comment-fr|}}}}}}}}}
2eca5fd9ca33bfeb138bf2052b1997a913f9b0cc
118
112
2015-02-19T15:27:08Z
Seb35
1
+type=reading, +traduction en français des types
wikitext
text/x-wiki
* {{#ifeq:{{int:lang}}|en|{{#time:F d, Y|{{{date}}}|en}}:|{{#time:d F Y|{{{date}}}}} :}} {{#switch:{{lc:{{{site|}}}}}|mediawiki.org=[MW.org] {{#if:{{{oldid}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki{{localurl:{{{page}}}|oldid={{{oldid}}}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|{{#if:{{{site|}}}|[{{{site}}}] [{{{site}}}{{urlencode:{{{uri}}}}} {{{uri}}}]}}}} {{#switch:{{{type|edition}}}|reading|lecture=Lecture {{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|translation|traduction={{#ifeq:{{int:lang}}|en|(''translation'')|(''traduction'')}}|translation-update|traduction-màj={{#ifeq:{{int:lang}}|en|(''updated translation'')|(''mise à jour de la traduction'')}}|edition|édition={{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|comment|commentaire|#default={{ucfirst:{{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|{{{comment-en}}}|{{{comment-fr|}}}}}|{{{comment-fr|}}}}}}}}}
914c54de026dfa397072be81f5e17e4adf17605e
119
118
2015-02-19T15:35:21Z
Seb35
1
+ofswiki.org
wikitext
text/x-wiki
* {{#ifeq:{{int:lang}}|en|{{#time:F d, Y|{{{date}}}|en}}:|{{#time:d F Y|{{{date}}}}} :}} {{#switch:{{lc:{{{site|ofswiki.org}}}}}|mediawiki.org=[MW.org] {{#if:{{{oldid}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki{{localurl:{{{page}}}|oldid={{{oldid}}}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|ofswiki.org=[ofswiki.org] <span class="plainlinks">[https://ofswiki.org/wiki{{localurl:{{{page}}}|{{#if:{{{oldid}}}|oldid={{{oldid}}}}}}} {{{page}}}]</span>|{{#if:{{{site|}}}|[{{{site}}}] [{{{site}}}{{urlencode:{{{uri}}}}} {{{uri}}}]}}}} {{#switch:{{{type|edition}}}|reading|lecture=Lecture {{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|translation|traduction={{#ifeq:{{int:lang}}|en|(''translation'')|(''traduction'')}}|translation-update|traduction-màj={{#ifeq:{{int:lang}}|en|(''updated translation'')|(''mise à jour de la traduction'')}}|edition|édition={{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|comment|commentaire|#default={{ucfirst:{{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|{{{comment-en}}}|{{{comment-fr|}}}}}|{{{comment-fr|}}}}}}}}}
204affe3b97b3311e7ac76abc2a969c1bced681c
120
119
2015-02-19T15:37:11Z
Seb35
1
fix bug, rm debug
wikitext
text/x-wiki
* {{#ifeq:{{int:lang}}|en|{{#time:F d, Y|{{{date}}}|en}}:|{{#time:d F Y|{{{date}}}}} :}} {{#switch:{{lc:{{{site|}}}}}|mediawiki.org=[MW.org] {{#if:{{{oldid|}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki{{localurl:{{{page}}}|oldid={{{oldid}}}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|ofswiki.org=[ofswiki.org] <span class="plainlinks">[https://ofswiki.org/wiki{{localurl:{{{page}}}|{{#if:{{{oldid|}}}|oldid={{{oldid}}}}}}} {{{page}}}]</span>|{{#if:{{{site|}}}|[{{{site}}}] [{{{site}}}{{urlencode:{{{uri}}}}} {{{uri}}}]}}}} {{#switch:{{{type|edition}}}|reading|lecture=Lecture {{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|translation|traduction={{#ifeq:{{int:lang}}|en|(''translation'')|(''traduction'')}}|translation-update|traduction-màj={{#ifeq:{{int:lang}}|en|(''updated translation'')|(''mise à jour de la traduction'')}}|edition|édition={{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|comment|commentaire|#default={{ucfirst:{{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|{{{comment-en}}}|{{{comment-fr|}}}}}|{{{comment-fr|}}}}}}}}}
b208e7230b561002821700124fc010b8ce9a5416
122
120
2015-02-19T15:46:23Z
Seb35
1
mention du type
wikitext
text/x-wiki
* {{#ifeq:{{int:lang}}|en|{{#time:F d, Y|{{{date}}}|en}}:|{{#time:d F Y|{{{date}}}}} :}} {{#switch:{{lc:{{{site|}}}}}|mediawiki.org=[MW.org] {{#if:{{{oldid|}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki{{localurl:{{{page}}}|oldid={{{oldid}}}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|ofswiki.org=[ofswiki.org] <span class="plainlinks">[https://ofswiki.org/wiki{{localurl:{{{page}}}|{{#if:{{{oldid|}}}|oldid={{{oldid}}}}}}} {{{page}}}]</span>|{{#if:{{{site|}}}|[{{{site}}}] [{{{site}}}{{urlencode:{{{uri}}}}} {{{uri}}}]}}}} {{#switch:{{{type|edition}}}|reading|lecture=:{{#ifeq:{{int:lang}}|en|read {{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|lu {{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|translation|traduction=: {{#ifeq:{{int:lang}}|en|translated|traduit}}|translation-update|traduction-màj=: {{#ifeq:{{int:lang}}|en|updated translation|mis à jour la traduction}}|edition|édition=: {{#ifeq:{{int:lang}}|en|edited {{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|modifié {{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|comment|commentaire|#default={{ucfirst:{{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|{{{comment-en}}}|{{{comment-fr|}}}}}|{{{comment-fr|}}}}}}}}}
ff162be6e46e23b74a854b76ddb032aabd6bf453
123
122
2015-02-19T15:47:13Z
Seb35
1
typo
wikitext
text/x-wiki
* {{#ifeq:{{int:lang}}|en|{{#time:F d, Y|{{{date}}}|en}}:|{{#time:d F Y|{{{date}}}}} :}} {{#switch:{{lc:{{{site|}}}}}|mediawiki.org=[MW.org] {{#if:{{{oldid|}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki{{localurl:{{{page}}}|oldid={{{oldid}}}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|ofswiki.org=[ofswiki.org] <span class="plainlinks">[https://ofswiki.org/wiki{{localurl:{{{page}}}|{{#if:{{{oldid|}}}|oldid={{{oldid}}}}}}} {{{page}}}]</span>|{{#if:{{{site|}}}|[{{{site}}}] [{{{site}}}{{urlencode:{{{uri}}}}} {{{uri}}}]}}}} {{#switch:{{{type|edition}}}|reading|lecture=: {{#ifeq:{{int:lang}}|en|read {{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|lu {{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|translation|traduction=: {{#ifeq:{{int:lang}}|en|translated|traduit}}|translation-update|traduction-màj=: {{#ifeq:{{int:lang}}|en|updated translation|mis à jour la traduction}}|edition|édition=: {{#ifeq:{{int:lang}}|en|edited {{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|modifié {{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|comment|commentaire|#default={{ucfirst:{{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|{{{comment-en}}}|{{{comment-fr|}}}}}|{{{comment-fr|}}}}}}}}}
45a9c3817bd475d71840ca2b39857d4921a76c7d
124
123
2015-02-19T15:51:20Z
Seb35
1
typo
wikitext
text/x-wiki
* {{#ifeq:{{int:lang}}|en|{{#time:F d, Y|{{{date}}}|en}}:|{{#time:d F Y|{{{date}}}}} :}} {{#switch:{{lc:{{{site|}}}}}|mediawiki.org=[MW.org] {{#if:{{{oldid|}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki{{localurl:{{{page}}}|oldid={{{oldid}}}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|ofswiki.org=[ofswiki.org] <span class="plainlinks">[https://ofswiki.org/wiki{{localurl:{{{page}}}|{{#if:{{{oldid|}}}|oldid={{{oldid}}}}}}} {{{page}}}]</span>|{{#if:{{{site|}}}|[{{{site}}}] [{{{site}}}{{urlencode:{{{uri}}}}} {{{uri}}}]}}}}{{#switch:{{{type|edition}}}|comment|commentaire=|#default={{#ifeq:{{int:lang}}|en|:| :}}}} {{#switch:{{{type|edition}}}|reading|lecture={{#ifeq:{{int:lang}}|en|read {{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|lu {{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|translation|traduction={{#ifeq:{{int:lang}}|en|translated|traduit}}|translation-update|traduction-màj={{#ifeq:{{int:lang}}|en|updated translation|mis à jour la traduction}}|edition|édition={{#ifeq:{{int:lang}}|en|edited {{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|modifié {{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|comment|commentaire|#default={{ucfirst:{{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|{{{comment-en}}}|{{{comment-fr|}}}}}|{{{comment-fr|}}}}}}}}}
abe056767c3435ce18e830d6265fd5611ee1a92f
125
124
2015-02-19T15:52:14Z
Seb35
1
syntaxe
wikitext
text/x-wiki
* {{#ifeq:{{int:lang}}|en|{{#time:F d, Y|{{{date}}}|en}}:|{{#time:d F Y|{{{date}}}}} :}} {{#switch:{{lc:{{{site|}}}}}|mediawiki.org=[MW.org] {{#if:{{{oldid|}}}|<span class="plainlinks">[https://www.mediawiki.org/wiki{{localurl:{{{page}}}|oldid={{{oldid}}}}} {{{page}}}]</span>|[[:mw:{{{page}}}|{{{page}}}]]}}|ofswiki.org=[ofswiki.org] <span class="plainlinks">[https://ofswiki.org/wiki{{localurl:{{{page}}}|{{#if:{{{oldid|}}}|oldid={{{oldid}}}}}}} {{{page}}}]</span>|{{#if:{{{site|}}}|[{{{site}}}] [{{{site}}}{{urlencode:{{{uri}}}}} {{{uri}}}]}}}}{{#switch:{{{type|edition}}}|comment|commentaire=|#default={{#ifeq:{{int:lang}}|en|:| :}}}} {{#switch:{{{type|edition}}}|reading|lecture={{#ifeq:{{int:lang}}|en|read {{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|lu {{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|translation|traduction={{#ifeq:{{int:lang}}|en|translated|traduit}}|translation-update|traduction-màj={{#ifeq:{{int:lang}}|en|updated translation|mis à jour la traduction}}|edition|édition={{#ifeq:{{int:lang}}|en|edited {{#if:{{{comment-en|}}}|(''{{{comment-en}}}'')|{{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|modifié {{#if:{{{comment-fr|}}}|(''{{{comment-fr}}}'')}}}}|comment|commentaire|#default={{ucfirst:{{#ifeq:{{int:lang}}|en|{{#if:{{{comment-en|}}}|{{{comment-en}}}|{{{comment-fr|}}}}}|{{{comment-fr|}}}}}}}}}
7e028f5013dd1324893b8bf6b18220c413b0acb5
Log/Seb35
0
29
106
94
2015-02-19T11:43:03Z
Seb35
1
liste antéchronologique
wikitext
text/x-wiki
{{log|user=Seb35|date=2015-02-15|site=mediawiki.org|page=Template:Timeline MediaWiki|type=edition|comment-fr=mise à jour et correction de la frise chronologique des versions de MediaWiki|comment-en=updated et corrected the MediaWiki versions timeline|oldid=1410930}}
{{log|user=Seb35|date=2015-02-15|site=mediawiki.org|page=Release notes/data|type=edition|comment-fr=recensement des métadonnées autour des versions de MediaWiki|comment-en=census of the metadata around MediaWiki versions|oldid=1410218}}
{{log|user=Seb35|date=2015-02-14|site=mediawiki.org|page=Download/fr|type=translation-update|oldid=1409804}}
{{log|user=Seb35|date=2015-02-14|site=mediawiki.org|page=Category:MediaWiki version information templates|type=edition|oldid=1409751|comment-fr=lisibilité améliorée du tableau des versions en cours|comment-en=improved readibility of the current versions table}}
<!--
{{log|user=Seb35|date=2015--|site=mediawiki.org|page=|type=edition|comment-fr=|comment-en=|}}
-->
8858ca9ca2c24638e6a4eb8349d702161d61cae0
113
106
2015-02-19T12:00:08Z
Seb35
1
+1
wikitext
text/x-wiki
{{log|user=Seb35|date=2015-02-15|site=mediawiki.org|page=Template:Timeline MediaWiki|type=edition|comment-fr=mise à jour et correction de la frise chronologique des versions de MediaWiki|comment-en=updated et corrected the MediaWiki versions timeline|oldid=1410930}}
{{log|user=Seb35|date=2015-02-15|site=mediawiki.org|page=Release notes/data|type=edition|comment-fr=recensement des métadonnées autour des versions de MediaWiki|comment-en=census of the metadata around MediaWiki versions|oldid=1410218}}
{{log|user=Seb35|date=2015-02-14|site=mediawiki.org|page=Download/fr|type=translation-update|oldid=1409804}}
{{log|user=Seb35|date=2015-02-14|site=mediawiki.org|page=Category:MediaWiki version information templates|type=edition|oldid=1409751|comment-fr=lisibilité améliorée du tableau des versions en cours|comment-en=improved readibility of the current versions table}}
{{log|user=Seb35|date=2015-02-13|type=comment|comment-fr=création de statistiques sur les extensions de MediaWiki (pas encore publié)|comment-en=creation of statistics about MediaWiki extensions (not yet published)}}
<!--
{{log|user=Seb35|date=2015--|site=mediawiki.org|page=|type=edition|comment-fr=|comment-en=|}}
-->
124d834abc0d2e2df5a8a8e641c1763c6b8c5a30
114
113
2015-02-19T12:05:13Z
Seb35
1
+lien pour afficher en anglais
wikitext
text/x-wiki
<div class="plainlinks" style="float:right; border:1px solid black; padding:0.5em;">[{{fullurl:{{PAGENAME}}|uselang=en}} Display in English]</div>
{{log|user=Seb35|date=2015-02-15|site=mediawiki.org|page=Template:Timeline MediaWiki|type=edition|comment-fr=mise à jour et correction de la frise chronologique des versions de MediaWiki|comment-en=updated et corrected the MediaWiki versions timeline|oldid=1410930}}
{{log|user=Seb35|date=2015-02-15|site=mediawiki.org|page=Release notes/data|type=edition|comment-fr=recensement des métadonnées autour des versions de MediaWiki|comment-en=census of the metadata around MediaWiki versions|oldid=1410218}}
{{log|user=Seb35|date=2015-02-14|site=mediawiki.org|page=Download/fr|type=translation-update|oldid=1409804}}
{{log|user=Seb35|date=2015-02-14|site=mediawiki.org|page=Category:MediaWiki version information templates|type=edition|oldid=1409751|comment-fr=lisibilité améliorée du tableau des versions en cours|comment-en=improved readibility of the current versions table}}
{{log|user=Seb35|date=2015-02-13|type=comment|comment-fr=création de statistiques sur les extensions de MediaWiki (pas encore publié)|comment-en=creation of statistics about MediaWiki extensions (not yet published)}}
<!--
{{log|user=Seb35|date=2015--|site=mediawiki.org|page=|type=edition|comment-fr=|comment-en=|}}
-->
59914c4c5ca9a3ef9cc628f11a61b6137540f984
116
114
2015-02-19T14:40:30Z
Seb35
1
proposer d’afficher en français lorsque c’est en anglais
wikitext
text/x-wiki
<div class="plainlinks" style="float:right; border:1px solid black; padding:0.5em;">{{#ifeq:{{int:lang}}|en|[[{{PAGENAME}}|Afficher en français]]|[{{fullurl:{{PAGENAME}}|uselang=en}} Display in English]}}</div>
{{log|user=Seb35|date=2015-02-15|site=mediawiki.org|page=Template:Timeline MediaWiki|type=edition|comment-fr=mise à jour et correction de la frise chronologique des versions de MediaWiki|comment-en=updated et corrected the MediaWiki versions timeline|oldid=1410930}}
{{log|user=Seb35|date=2015-02-15|site=mediawiki.org|page=Release notes/data|type=edition|comment-fr=recensement des métadonnées autour des versions de MediaWiki|comment-en=census of the metadata around MediaWiki versions|oldid=1410218}}
{{log|user=Seb35|date=2015-02-14|site=mediawiki.org|page=Download/fr|type=translation-update|oldid=1409804}}
{{log|user=Seb35|date=2015-02-14|site=mediawiki.org|page=Category:MediaWiki version information templates|type=edition|oldid=1409751|comment-fr=lisibilité améliorée du tableau des versions en cours|comment-en=improved readibility of the current versions table}}
{{log|user=Seb35|date=2015-02-13|type=comment|comment-fr=création de statistiques sur les extensions de MediaWiki (pas encore publié)|comment-en=creation of statistics about MediaWiki extensions (not yet published)}}
<!--
{{log|user=Seb35|date=2015--|site=mediawiki.org|page=|type=edition|comment-fr=|comment-en=|}}
-->
fc946db94a1c6424f34fc839023d2f6b07c50317
117
116
2015-02-19T14:41:59Z
Seb35
1
syntaxe -- la précédente, même si plus jolie, ne crée pas de lien puisque c’est la page elle-même
wikitext
text/x-wiki
<div class="plainlinks" style="float:right; border:1px solid black; padding:0.5em;">{{#ifeq:{{int:lang}}|en|[{{fullurl:{{PAGENAME}}}} Afficher en français]|[{{fullurl:{{PAGENAME}}|uselang=en}} Display in English]}}</div>
{{log|user=Seb35|date=2015-02-15|site=mediawiki.org|page=Template:Timeline MediaWiki|type=edition|comment-fr=mise à jour et correction de la frise chronologique des versions de MediaWiki|comment-en=updated et corrected the MediaWiki versions timeline|oldid=1410930}}
{{log|user=Seb35|date=2015-02-15|site=mediawiki.org|page=Release notes/data|type=edition|comment-fr=recensement des métadonnées autour des versions de MediaWiki|comment-en=census of the metadata around MediaWiki versions|oldid=1410218}}
{{log|user=Seb35|date=2015-02-14|site=mediawiki.org|page=Download/fr|type=translation-update|oldid=1409804}}
{{log|user=Seb35|date=2015-02-14|site=mediawiki.org|page=Category:MediaWiki version information templates|type=edition|oldid=1409751|comment-fr=lisibilité améliorée du tableau des versions en cours|comment-en=improved readibility of the current versions table}}
{{log|user=Seb35|date=2015-02-13|type=comment|comment-fr=création de statistiques sur les extensions de MediaWiki (pas encore publié)|comment-en=creation of statistics about MediaWiki extensions (not yet published)}}
<!--
{{log|user=Seb35|date=2015--|site=mediawiki.org|page=|type=edition|comment-fr=|comment-en=|}}
-->
e6b1a5bfd1329c4f73765066a8e68571ad8408a2
121
117
2015-02-19T15:37:41Z
Seb35
1
+1
wikitext
text/x-wiki
<div class="plainlinks" style="float:right; border:1px solid black; padding:0.5em;">{{#ifeq:{{int:lang}}|en|[{{fullurl:{{PAGENAME}}}} Afficher en français]|[{{fullurl:{{PAGENAME}}|uselang=en}} Display in English]}}</div>
{{log|user=Seb35|date=2015-02-19|site=ofswiki.org|page=Mediawiki Setup Guide|type=lecture|comment-fr=guide intéressant car il couvre plusieurs facettes du travail d’administration système de MediaWiki|comment-en=interesting guide because it covers many facets around MediaWiki sysadminship}}
{{log|user=Seb35|date=2015-02-15|site=mediawiki.org|page=Template:Timeline MediaWiki|type=edition|comment-fr=mise à jour et correction de la frise chronologique des versions de MediaWiki|comment-en=updated et corrected the MediaWiki versions timeline|oldid=1410930}}
{{log|user=Seb35|date=2015-02-15|site=mediawiki.org|page=Release notes/data|type=edition|comment-fr=recensement des métadonnées autour des versions de MediaWiki|comment-en=census of the metadata around MediaWiki versions|oldid=1410218}}
{{log|user=Seb35|date=2015-02-14|site=mediawiki.org|page=Download/fr|type=translation-update|oldid=1409804}}
{{log|user=Seb35|date=2015-02-14|site=mediawiki.org|page=Category:MediaWiki version information templates|type=edition|oldid=1409751|comment-fr=lisibilité améliorée du tableau des versions en cours|comment-en=improved readibility of the current versions table}}
{{log|user=Seb35|date=2015-02-13|type=comment|comment-fr=création de statistiques sur les extensions de MediaWiki (pas encore publié)|comment-en=creation of statistics about MediaWiki extensions (not yet published)}}
<!--
{{log|user=Seb35|date=2015--|site=mediawiki.org|page=|type=edition|comment-fr=|comment-en=|}}
-->
44e338d8c3a1b19fd99c9588b4db4f84f66efd47
137
121
2015-03-04T14:25:05Z
Seb35
1
+1
wikitext
text/x-wiki
<div class="plainlinks" style="float:right; border:1px solid black; padding:0.5em;">{{#ifeq:{{int:lang}}|en|[{{fullurl:{{PAGENAME}}}} Afficher en français]|[{{fullurl:{{PAGENAME}}|uselang=en}} Display in English]}}</div>
{{log|user=Seb35|date=2015-03-04|site=mediawiki.org|page=Statistics about extensions|type=edition|oldid=1432378|comment-fr=publication de statistiques sur les extensions MediaWiki|comment-en=publication of statistics about MediaWiki extensions}}
{{log|user=Seb35|date=2015-02-19|site=ofswiki.org|page=Mediawiki Setup Guide|type=lecture|comment-fr=guide intéressant car il couvre plusieurs facettes du travail d’administration système de MediaWiki|comment-en=interesting guide because it covers many facets around MediaWiki sysadminship}}
{{log|user=Seb35|date=2015-02-15|site=mediawiki.org|page=Template:Timeline MediaWiki|type=edition|comment-fr=mise à jour et correction de la frise chronologique des versions de MediaWiki|comment-en=updated et corrected the MediaWiki versions timeline|oldid=1410930}}
{{log|user=Seb35|date=2015-02-15|site=mediawiki.org|page=Release notes/data|type=edition|comment-fr=recensement des métadonnées autour des versions de MediaWiki|comment-en=census of the metadata around MediaWiki versions|oldid=1410218}}
{{log|user=Seb35|date=2015-02-14|site=mediawiki.org|page=Download/fr|type=translation-update|oldid=1409804}}
{{log|user=Seb35|date=2015-02-14|site=mediawiki.org|page=Category:MediaWiki version information templates|type=edition|oldid=1409751|comment-fr=lisibilité améliorée du tableau des versions en cours|comment-en=improved readibility of the current versions table}}
{{log|user=Seb35|date=2015-02-13|type=comment|comment-fr=création de statistiques sur les extensions de MediaWiki (pas encore publié)|comment-en=creation of statistics about MediaWiki extensions (not yet published)}}
<!--
{{log|user=Seb35|date=2015--|site=mediawiki.org|page=|type=edition|comment-fr=|comment-en=|}}
-->
59f14c8ec204c12a2f27f5bf52b8315fbb07b6b0
151
137
2015-03-05T15:51:44Z
Seb35
1
+1
wikitext
text/x-wiki
<div class="plainlinks" style="float:right; border:1px solid black; padding:0.5em;">{{#ifeq:{{int:lang}}|en|[{{fullurl:{{PAGENAME}}}} Afficher en français]|[{{fullurl:{{PAGENAME}}|uselang=en}} Display in English]}}</div>
{{log|user=Seb35|date=2015-03-05|site=mediawiki.org|page=User:Seb35/modifyToolbox|type=edition|oldid=1433375|comment-fr=publication d’un morceau de code pour modifier facilement la boîte à outils dans l’interface MediaWiki|comment-en=publication of a code snippet to easily modify the toolbox in MediaWiki interface}}
{{log|user=Seb35|date=2015-03-04|site=mediawiki.org|page=Statistics about extensions|type=edition|oldid=1432378|comment-fr=publication de statistiques sur les extensions MediaWiki|comment-en=publication of statistics about MediaWiki extensions}}
{{log|user=Seb35|date=2015-02-19|site=ofswiki.org|page=Mediawiki Setup Guide|type=lecture|comment-fr=guide intéressant car il couvre plusieurs facettes du travail d’administration système de MediaWiki|comment-en=interesting guide because it covers many facets around MediaWiki sysadminship}}
{{log|user=Seb35|date=2015-02-15|site=mediawiki.org|page=Template:Timeline MediaWiki|type=edition|comment-fr=mise à jour et correction de la frise chronologique des versions de MediaWiki|comment-en=updated et corrected the MediaWiki versions timeline|oldid=1410930}}
{{log|user=Seb35|date=2015-02-15|site=mediawiki.org|page=Release notes/data|type=edition|comment-fr=recensement des métadonnées autour des versions de MediaWiki|comment-en=census of the metadata around MediaWiki versions|oldid=1410218}}
{{log|user=Seb35|date=2015-02-14|site=mediawiki.org|page=Download/fr|type=translation-update|oldid=1409804}}
{{log|user=Seb35|date=2015-02-14|site=mediawiki.org|page=Category:MediaWiki version information templates|type=edition|oldid=1409751|comment-fr=lisibilité améliorée du tableau des versions en cours|comment-en=improved readibility of the current versions table}}
{{log|user=Seb35|date=2015-02-13|type=comment|comment-fr=création de statistiques sur les extensions de MediaWiki (pas encore publié)|comment-en=creation of statistics about MediaWiki extensions (not yet published)}}
<!--
{{log|user=Seb35|date=2015--|site=mediawiki.org|page=|type=edition|comment-fr=|comment-en=|}}
-->
d4143fa58168aa8ed3ad698212be1e8fa16b6453
200
151
2015-03-08T22:25:30Z
Seb35
1
+1
wikitext
text/x-wiki
<div class="plainlinks" style="float:right; border:1px solid black; padding:0.5em;">{{#ifeq:{{int:lang}}|en|[{{fullurl:{{PAGENAME}}}} Afficher en français]|[{{fullurl:{{PAGENAME}}|uselang=en}} Display in English]}}</div>
{{log|user=Seb35|date=2015-03-08|site=mediawiki.org|page=Manual:Interface/Sidebar|type=edition|oldid=1437573|comment-fr=mention de la modification de la boîte à outil|comment-en=add a paragraph about the change of the toolbox}}
{{log|user=Seb35|date=2015-03-05|site=mediawiki.org|page=User:Seb35/modifyToolbox|type=edition|oldid=1433375|comment-fr=publication d’un morceau de code pour modifier facilement la boîte à outils dans l’interface MediaWiki|comment-en=publication of a code snippet to easily modify the toolbox in MediaWiki interface}}
{{log|user=Seb35|date=2015-03-04|site=mediawiki.org|page=Statistics about extensions|type=edition|oldid=1432378|comment-fr=publication de statistiques sur les extensions MediaWiki|comment-en=publication of statistics about MediaWiki extensions}}
{{log|user=Seb35|date=2015-02-19|site=ofswiki.org|page=Mediawiki Setup Guide|type=lecture|comment-fr=guide intéressant car il couvre plusieurs facettes du travail d’administration système de MediaWiki|comment-en=interesting guide because it covers many facets around MediaWiki sysadminship}}
{{log|user=Seb35|date=2015-02-15|site=mediawiki.org|page=Template:Timeline MediaWiki|type=edition|comment-fr=mise à jour et correction de la frise chronologique des versions de MediaWiki|comment-en=updated et corrected the MediaWiki versions timeline|oldid=1410930}}
{{log|user=Seb35|date=2015-02-15|site=mediawiki.org|page=Release notes/data|type=edition|comment-fr=recensement des métadonnées autour des versions de MediaWiki|comment-en=census of the metadata around MediaWiki versions|oldid=1410218}}
{{log|user=Seb35|date=2015-02-14|site=mediawiki.org|page=Download/fr|type=translation-update|oldid=1409804}}
{{log|user=Seb35|date=2015-02-14|site=mediawiki.org|page=Category:MediaWiki version information templates|type=edition|oldid=1409751|comment-fr=lisibilité améliorée du tableau des versions en cours|comment-en=improved readibility of the current versions table}}
{{log|user=Seb35|date=2015-02-13|type=comment|comment-fr=création de statistiques sur les extensions de MediaWiki (pas encore publié)|comment-en=creation of statistics about MediaWiki extensions (not yet published)}}
<!--
{{log|user=Seb35|date=2015--|site=mediawiki.org|page=|type=edition|comment-fr=|comment-en=|}}
-->
f29601b95dba1496e6ead8e9dd332ec423eed9d3
Accueil
0
1
115
93
2015-02-19T12:06:47Z
Seb35
1
/* Autres */ +1
wikitext
text/x-wiki
Ce wiki me sert de base de connaissance dans le cadre des activités de [[:seb35:|mon entreprise]].
Il peut comporter des pages de contenu ou simplement des liens vers d’autres sites pour les activités collaboratives. Vous pouvez vous créer un compte si vous voulez discuter ou modifier une erreur.
== Pages du wiki ==
=== Tutoriaux ===
{{Special:Allpages/Tutorial:}}
=== Autres ===
* [[Archéo Lex]]
* [[Syntaxes de formatage léger]]
* [[Log/Seb35]]
41c20df7ce1271c09c93e7d89ce8bd49d95b26c0
136
115
2015-03-04T14:22:05Z
Seb35
1
/* Autres */ +1
wikitext
text/x-wiki
Ce wiki me sert de base de connaissance dans le cadre des activités de [[:seb35:|mon entreprise]].
Il peut comporter des pages de contenu ou simplement des liens vers d’autres sites pour les activités collaboratives. Vous pouvez vous créer un compte si vous voulez discuter ou modifier une erreur.
== Pages du wiki ==
=== Tutoriaux ===
{{Special:Allpages/Tutorial:}}
=== Autres ===
* [[Archéo Lex]]
* [[Syntaxes de formatage léger]]
* [[Log/Seb35]]
* [[MediaWiki]]
be9c29e92250615226245d316ad71789d28994da
MediaWiki
0
34
127
2015-03-02T15:51:56Z
Seb35
1
description de MediaWiki, quelques idées d’usages
wikitext
text/x-wiki
'''MediaWiki''' est un logiciel de wiki : il permet la gestion collaborative de connaissances, pour rassembler des communautés soit d’une certaine taille soit trop dispersées géographiquement pour se rencontrer régulièrement.
<div class="plainlinks">Deux types de profils :
# wiki interne au sein d’une entreprise (d’une certaine taille) : permet une mémoire collective et partagée, par exemple :
#* présenter et documenter les savoir-faire métier internes, par exemple les méthodes de production, ce qui peut servir aux commerciaux pour mieux comprendre ce qui se fait et affiner leur discours ;
#* partager et tenir à jour les procédures et politiques internes : processus comptables, remboursements de notes de frais, gestion des congés, intéressement des salariés, documentation sur l’informatique, etc. ;
#* servir de support pour diffuser les grandes orientations de l’entreprise (stratégie, budget et plan annuels, etc.) voire les comptes-rendus de réunion ;
#* possiblement stocker des documents ''s’ils peuvent être vus par tous les utilisateurs du wiki'', par exemple pour un wiki ouvert à tous les salariés certains documents ne devraient pas y être (car relevant de la vie privée, ou trop secrets pour être trop partagés, etc.) ;
#* discuter autour des points précédents, par exemple sur la stratégie de l’entreprise ; cela peut bien sûr être fait autour de la machine à café dans les petites entreprises, mais ça devient moins possible dans les plus grosses entreprises.
#* Exemples : [[:frwikipedia:Intellipedia|Intellipedia]] (wikis internes aux services secrets américains), [[:enwikipedia:Diplopedia|Diplopedia]] (wiki interne au Département d’État américain), [https://wiki.openstreetmap.org/ OpenStreetMap] (wiki de travail autour du projet OSM), [https://meta.wikimedia.org Meta-Wiki] (wiki de travail autour des projets Wikimedia), [http://wiki.breizh-entropy.org/ Wiki du hackerspace Breizh Entropy] (wiki de documentation et mémoire collective)
# wiki communautaire autour d’un sujet donné : c’est l’usage originel des wikis sur l’Internet, pour permettre à toutes les bonnes volontés d’améliorer la connaissance autour d’un sujet ; cela peut être :
#* la matière encyclopédique, par exemple [https://www.wikipedia.org/ Wikipédia] : beaucoup de sujets mais chacun ne comprend que des éléments généraux, sans rentrer trop dans le détail,
#* un domaine spécialisé voire hyper-spécialisé, par exemple [http://www.ekopedia.org/ Ékopédia] (solutions écologiques), [http://starwars.wikia.com/ Wookieepedia] (univers Star Wars), [http://www.ratoupedia.org/wiki/Accueil Ratoupédia] (rats domestiques), [https://www.owasp.org/ OWASP] (sécurité informatique), une grande partie des wikis sur [http://www.wikia.com/ Wikia],
#* la mémoire ou documentation d’un territoire donné, par exemple [http://www.wiki-brest.net/ Wiki-Brest], [http://www.wiki-rennes.fr/ Wiki-Rennes]
#* des cours en ligne (par exemple la [https://www.wikiversity.org/ Wikiversité]) ou des savoir-faire (par exemple [https://www.wikibooks.org/ Wikibooks] ou [http://www.ekopedia.org/ Ékopédia]),
#* des bases de données, par exemple [https://www.wikidata.org/ Wikidata] (base de données "encyclopédique"), [https://www.wikiquote.org/ Wikiquote] (recueil de citations), [https://www.wikidata.org/ Wikispecies] (recensement des espèces), [https://commons.wikimedia.org/ Wikimedia Commons] (médiathèque), [https://www.wiktionary.org/ Wiktionnaire] (dictionnaire).
</div>
414d8003c5086119cc31206d03680eebff09c864
130
127
2015-03-02T18:35:33Z
Seb35
1
+faire vivre un wiki
wikitext
text/x-wiki
'''MediaWiki''' est un logiciel de wiki : il permet la gestion collaborative de connaissances, pour rassembler des communautés soit d’une certaine taille soit trop dispersées géographiquement pour se rencontrer régulièrement.
== Types d’usages ==
<div class="plainlinks">Deux types de profils :
# wiki interne au sein d’une entreprise (d’une certaine taille) : permet une mémoire collective et partagée, par exemple :
#* présenter et documenter les savoir-faire métier internes, par exemple les méthodes de production, ce qui peut servir aux commerciaux pour mieux comprendre ce qui se fait et affiner leur discours ;
#* partager et tenir à jour les procédures et politiques internes : processus comptables, remboursements de notes de frais, gestion des congés, intéressement des salariés, documentation sur l’informatique, etc. ;
#* servir de support pour diffuser les grandes orientations de l’entreprise (stratégie, budget et plan annuels, etc.) voire les comptes-rendus de réunion ;
#* possiblement stocker des documents ''s’ils peuvent être vus par tous les utilisateurs du wiki'', par exemple pour un wiki ouvert à tous les salariés certains documents ne devraient pas y être (car relevant de la vie privée, ou trop secrets pour être trop partagés, etc.) ;
#* discuter autour des points précédents, par exemple sur la stratégie de l’entreprise ; cela peut bien sûr être fait autour de la machine à café dans les petites entreprises, mais ça devient moins possible dans les plus grosses entreprises.
#* Exemples : [[:frwikipedia:Intellipedia|Intellipedia]] (wikis internes aux services secrets américains), [[:enwikipedia:Diplopedia|Diplopedia]] (wiki interne au Département d’État américain), [https://wiki.openstreetmap.org/ OpenStreetMap] (wiki de travail autour du projet OSM), [https://meta.wikimedia.org Meta-Wiki] (wiki de travail autour des projets Wikimedia), [http://wiki.breizh-entropy.org/ Wiki du hackerspace Breizh Entropy] (wiki de documentation et mémoire collective)
# wiki communautaire autour d’un sujet donné : c’est l’usage originel des wikis sur l’Internet, pour permettre à toutes les bonnes volontés d’améliorer la connaissance autour d’un sujet ; cela peut être :
#* la matière encyclopédique, par exemple [https://www.wikipedia.org/ Wikipédia] : beaucoup de sujets mais chacun ne comprend que des éléments généraux, sans rentrer trop dans le détail,
#* un domaine spécialisé voire hyper-spécialisé, par exemple [http://www.ekopedia.org/ Ékopédia] (solutions écologiques), [http://starwars.wikia.com/ Wookieepedia] (univers Star Wars), [http://www.ratoupedia.org/wiki/Accueil Ratoupédia] (rats domestiques), [https://www.owasp.org/ OWASP] (sécurité informatique), une grande partie des wikis sur [http://www.wikia.com/ Wikia],
#* la mémoire ou documentation d’un territoire donné, par exemple [http://www.wiki-brest.net/ Wiki-Brest], [http://www.wiki-rennes.fr/ Wiki-Rennes]
#* des cours en ligne (par exemple la [https://www.wikiversity.org/ Wikiversité]) ou des savoir-faire (par exemple [https://www.wikibooks.org/ Wikibooks] ou [http://www.ekopedia.org/ Ékopédia]),
#* des bases de données, par exemple [https://www.wikidata.org/ Wikidata] (base de données "encyclopédique"), [https://www.wikiquote.org/ Wikiquote] (recueil de citations), [https://www.wikidata.org/ Wikispecies] (recensement des espèces), [https://commons.wikimedia.org/ Wikimedia Commons] (médiathèque), [https://www.wiktionary.org/ Wiktionnaire] (dictionnaire).
</div>
== Faire vivre un wiki ==
Comme l’a analysé et expliqué [http://www.anthere.org/post/2012/05/03/Motiver-les-participants-d-un-projet-wiki%3A-l-influence-des-rôles Anthere], il est crucial pour une vie saine d’un wiki que celui-ci soit régulièrement ''jardiné'', c’est-à-dire entretenu et rangé pour rester pratique à utiliser au quotidien.
Quoiqu’il est possible, dans un premier temps, qu’un unique animateur s’occupe de ce jardinage, il faut viser à court ou moyen terme que diverses personnes s’approprient l’outil et s’occupent chacune d’une facette du jardinage (cf le billet de blog précédent).
''ajouter : aspects techniques :''
* ''choisir les extensions et les installer''
* ''maintenir dans le temps les instances MediaWiki''
fbe79b1a918b4a2bc0a6f03ff30ff3eb094ea1fa
150
130
2015-03-05T14:52:56Z
Seb35
1
+bénéfices d’usage
wikitext
text/x-wiki
'''MediaWiki''' est un logiciel de wiki : il permet la gestion collaborative de connaissances, pour rassembler des communautés soit d’une certaine taille soit trop dispersées géographiquement pour se rencontrer régulièrement.
== Types d’usages ==
<div class="plainlinks">Deux types de profils :
# wiki interne au sein d’une entreprise (d’une certaine taille) : permet une mémoire collective et partagée, par exemple :
#* présenter et documenter les savoir-faire métier internes, par exemple les méthodes de production, ce qui peut servir aux commerciaux pour mieux comprendre ce qui se fait et affiner leur discours ;
#* partager et tenir à jour les procédures et politiques internes : processus comptables, remboursements de notes de frais, gestion des congés, intéressement des salariés, documentation sur l’informatique, etc. ;
#* servir de support pour diffuser les grandes orientations de l’entreprise (stratégie, budget et plan annuels, etc.) voire les comptes-rendus de réunion ;
#* possiblement stocker des documents ''s’ils peuvent être vus par tous les utilisateurs du wiki'', par exemple pour un wiki ouvert à tous les salariés certains documents ne devraient pas y être (car relevant de la vie privée, ou trop secrets pour être trop partagés, etc.) ;
#* discuter autour des points précédents, par exemple sur la stratégie de l’entreprise ; cela peut bien sûr être fait autour de la machine à café dans les petites entreprises, mais ça devient moins possible dans les plus grosses entreprises.
#* Exemples : [[:frwikipedia:Intellipedia|Intellipedia]] (wikis internes aux services secrets américains), [[:enwikipedia:Diplopedia|Diplopedia]] (wiki interne au Département d’État américain), [https://wiki.openstreetmap.org/ OpenStreetMap] (wiki de travail autour du projet OSM), [https://meta.wikimedia.org Meta-Wiki] (wiki de travail autour des projets Wikimedia), [http://wiki.breizh-entropy.org/ Wiki du hackerspace Breizh Entropy] (wiki de documentation et mémoire collective)
# wiki communautaire autour d’un sujet donné : c’est l’usage originel des wikis sur l’Internet, pour permettre à toutes les bonnes volontés d’améliorer la connaissance autour d’un sujet ; cela peut être :
#* la matière encyclopédique, par exemple [https://www.wikipedia.org/ Wikipédia] : beaucoup de sujets mais chacun ne comprend que des éléments généraux, sans rentrer trop dans le détail,
#* un domaine spécialisé voire hyper-spécialisé, par exemple [http://www.ekopedia.org/ Ékopédia] (solutions écologiques), [http://starwars.wikia.com/ Wookieepedia] (univers Star Wars), [http://www.ratoupedia.org/wiki/Accueil Ratoupédia] (rats domestiques), [https://www.owasp.org/ OWASP] (sécurité informatique), une grande partie des wikis sur [http://www.wikia.com/ Wikia],
#* la mémoire ou documentation d’un territoire donné, par exemple [http://www.wiki-brest.net/ Wiki-Brest], [http://www.wiki-rennes.fr/ Wiki-Rennes]
#* des cours en ligne (par exemple la [https://www.wikiversity.org/ Wikiversité]) ou des savoir-faire (par exemple [https://www.wikibooks.org/ Wikibooks] ou [http://www.ekopedia.org/ Ékopédia]),
#* des bases de données, par exemple [https://www.wikidata.org/ Wikidata] (base de données "encyclopédique"), [https://www.wikiquote.org/ Wikiquote] (recueil de citations), [https://www.wikidata.org/ Wikispecies] (recensement des espèces), [https://commons.wikimedia.org/ Wikimedia Commons] (médiathèque), [https://www.wiktionary.org/ Wiktionnaire] (dictionnaire).
</div>
== Bénéfices d’usage (en interne à une entreprise) ==
* Plateforme de publication de documents sur un réseau interne
* Archivage et évolution des documents prévue
* Travail en commun possible sur des documents (toutefois pas d’éditions concurrentes/en même temps)
* Polyvalence de l’outil (quoiqu’il puisse être compliqué de faire des "contenus dynamiques" sans être formé spécifiquement)
* Possibilité de discussion intégrée
== Faire vivre un wiki ==
Comme l’a analysé et expliqué [http://www.anthere.org/post/2012/05/03/Motiver-les-participants-d-un-projet-wiki%3A-l-influence-des-rôles Anthere], il est crucial pour une vie saine d’un wiki que celui-ci soit régulièrement ''jardiné'', c’est-à-dire entretenu et rangé pour rester pratique à utiliser au quotidien.
Quoiqu’il est possible, dans un premier temps, qu’un unique animateur s’occupe de ce jardinage, il faut viser à court ou moyen terme que diverses personnes s’approprient l’outil et s’occupent chacune d’une facette du jardinage (cf le billet de blog précédent).
''ajouter : aspects techniques :''
* ''choisir les extensions et les installer''
* ''maintenir dans le temps les instances MediaWiki''
73aa0e66ef19c1a608cc3dddaa823de5b53cb4d9
MediaWiki:Sidebar
8
42
138
2015-03-04T20:06:17Z
Seb35
1
test d’extension
wikitext
text/x-wiki
* navigation
** mainpage|mainpage-description
** recentchanges-url|recentchanges
** randompage-url|randompage
** helppage|help
* SEARCH
* TOOLBOX
** WHATLINKSHERE|whatlinkshere
** RECENTCHANGESLINKED|recentchangeslinked-toolbox
** FEEDS
** CONTRIBUTIONS|contributions
** LOG|log
** BLOCKIP|blockip
** EMAILUSER|emailuser
** USERRIGHTS|userrights
** UPLOAD|upload
** SPECIALPAGES|specialpages
** PRINT|printableversion
** PERMALINK|permalink
** INFO|pageinfo-toolboxlink
* LANGUAGES
0b2a72cdb0822ccd9a4f2cb57aaf30ac94648fec
140
138
2015-03-04T21:16:19Z
Seb35
1
test
wikitext
text/x-wiki
* navigation
** mainpage|mainpage-description
** recentchanges-url|recentchanges
** randompage-url|randompage
** helppage|help
* SEARCH
* TOOLBOX
** RECENTCHANGESLINKED|recentchangeslinked-toolbox
** WHATLINKSHERE|whatlinkshere
** FEEDS
** CONTRIBUTIONS|contributions
** LOG|log
** BLOCKIP|blockip
** EMAILUSER|emailuser
** USERRIGHTS|userrights
** UPLOAD|upload
** SPECIALPAGES|specialpages
** PRINT|printableversion
** PERMALINK|permalink
** INFO|pageinfo-toolboxlink
* LANGUAGES
caafc1a3851f66e6f609e174e320a4d4dc295b6a
141
140
2015-03-04T21:17:45Z
Seb35
1
test
wikitext
text/x-wiki
* navigation
** mainpage|mainpage-description
** recentchanges-url|recentchanges
** randompage-url|randompage
** helppage|help
* SEARCH
* TOOLBOX
** recentchanges-url|recentchanges
** WHATLINKSHERE|whatlinkshere
** RECENTCHANGESLINKED|recentchangeslinked-toolbox
** FEEDS
** CONTRIBUTIONS|contributions
** LOG|log
** BLOCKIP|blockip
** EMAILUSER|emailuser
** USERRIGHTS|userrights
** UPLOAD|upload
** SPECIALPAGES|specialpages
** PRINT|printableversion
** PERMALINK|permalink
** INFO|pageinfo-toolboxlink
* LANGUAGES
24d3deec09dcd4bdb561688170f2fe8ebe7de39e
144
141
2015-03-05T09:47:08Z
Seb35
1
test
wikitext
text/x-wiki
* navigation
** mainpage|mainpage-description
** recentchanges-url|recentchanges
** randompage-url|randompage
** helppage|help
* SEARCH
* TOOLBOX
** WHATLINKSHERE|whatlinkshere
** RECENTCHANGESLINKED|recentchangeslinked-toolbox
** recentchanges-url|recentchanges
** FEEDS
** CONTRIBUTIONS|contributions
** LOG|log
** BLOCKIP|blockip
** EMAILUSER|emailuser
** USERRIGHTS|userrights
** UPLOAD|upload
** SPECIALPAGES|specialpages
** PRINT|printableversion
** PERMALINK|permalink
** INFO|pageinfo-toolboxlink
* LANGUAGES
0e63cdbfc2e18611892d2e765e444e58ebdfd689
145
144
2015-03-05T09:51:04Z
Seb35
1
issue
wikitext
text/x-wiki
* navigation
** mainpage|mainpage-description
** recentchanges-url|recentchanges
** randompage-url|randompage
** helppage|help
* SEARCH
* TOOLBOX
** WHATLINKSHERE|whatlinkshere
** RECENTCHANGESLINKED|recentchangeslinked-toolbox
** recentchanges-url|recentchanges
** FEEDS|feeds
** CONTRIBUTIONS|contributions
** LOG|log
** BLOCKIP|blockip
** EMAILUSER|emailuser
** USERRIGHTS|userrights
** UPLOAD|upload
** SPECIALPAGES|specialpages
** PRINT|printableversion
** PERMALINK|permalink
** INFO|pageinfo-toolboxlink
* LANGUAGES
233ef2f48997885ef2011c758de4316100b07e05
146
145
2015-03-05T09:57:51Z
Seb35
1
test
wikitext
text/x-wiki
* navigation
** mainpage|mainpage-description
** recentchanges-url|recentchanges
** randompage-url|randompage
** helppage|help
* SEARCH
* TOOLBOX
** recentchanges-url|recentchanges
** WHATLINKSHERE|whatlinkshere
** RECENTCHANGESLINKED|recentchangeslinked-toolbox
** FEEDS|feeds
** CONTRIBUTIONS|contributions
** LOG|log
** BLOCKIP|blockip
** EMAILUSER|emailuser
** USERRIGHTS|userrights
** UPLOAD|upload
** SPECIALPAGES|specialpages
** PRINT|printableversion
** PERMALINK|permalink
** INFO|pageinfo-toolboxlink
* LANGUAGES
47eebd3284e5e5635fb9add66bb18860ab1d15ab
147
146
2015-03-05T11:03:20Z
Seb35
1
personnalisation
wikitext
text/x-wiki
* navigation
** mainpage|mainpage-description
** randompage-url|randompage
** helppage|help
* SEARCH
* TOOLBOX
** recentchanges-url|recentchanges
** WHATLINKSHERE|whatlinkshere
** RECENTCHANGESLINKED|recentchangeslinked-toolbox
** FEEDS|feeds
** CONTRIBUTIONS|contributions
** LOG|log
** BLOCKIP|blockip
** EMAILUSER|emailuser
** USERRIGHTS|userrights
** UPLOAD|upload
** SPECIALPAGES|specialpages
** PRINT|printableversion
** PERMALINK|permalink
** INFO|pageinfo-toolboxlink
* LANGUAGES
961c0b82f981b1348c73effe3b24a294dc9ccaad
Wiki Seb35:Copyrights
4
46
148
2015-03-05T14:43:42Z
Seb35
1
basique mais important
wikitext
text/x-wiki
Ce wiki est sous [http://www.wtfpl.net licence WTFPL 2.0].
Toutefois, même si ça n’est pas obligatoire, en cas de réutilisation, un petit mot serait le bienvenu :-) voir la section [[:seb35:contact|Contact du site]].
e04792bdda7b8c26f79ceeaa515e291d67b1b9a2
149
148
2015-03-05T14:45:28Z
Seb35
1
bon, mettons CC0 pour l’instant pour éviter les dissonances avec ce qu’il y a en bas des pages
wikitext
text/x-wiki
Ce wiki est sous [https://creativecommons.org/publicdomain/zero/1.0/ licence Creative Commons Zero (domaine public)].
Toutefois, même si ça n’est pas obligatoire, en cas de réutilisation, un petit mot serait le bienvenu :-) voir la section [[:seb35:contact|Contact du site]].
1ef93242e61ae6aa2cd6fef668aedb701be5e0e1
Tutorial:Beautiful MediaWiki URLs
102
178
205
76
2015-03-17T12:53:30Z
Seb35
1
typo
wikitext
text/x-wiki
{{Tutorial|lang=en|status=stable}}
This page is about configurating beautiful and pure URLs for MediaWiki, basically without any visible "index.php". For example:
<div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;">
:[{{SERVER}}/{{FULLPAGENAMEE}}?action=edit http://{{SERVERNAME}}/{{FULLPAGENAMEE}}?action=edit]
''instead of''
:[{{SERVER}}/index.php?title={{FULLPAGENAMEE}}&action=edit http://{{SERVERNAME}}/index.php?title={{FULLPAGENAMEE}}&action=edit]
</div>
and it is even better in languages with non-latin alphabets:
<div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;">
:[{{SERVER}}/维基百科?action=history http://{{SERVERNAME}}/维基百科?action=history]
''instead of''
:[{{SERVER}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history http://{{SERVERNAME}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history]
</div>
== Rationale and introduction ==
The reasoning behind this is: The syntax "index.php" is not interesting from the user’s point of view so it shouldn’t be there; additionally the user should (want) to see understandable page names instead of %-encoded nonsense.
You can see on this wiki these rules in action. Technically, these ugly URLs come from good’ ol’ time’ of [[:enwikipedia:Common Gateway Interface|CGI scripts]] (ten years ago), but now —and since some time— it is possible to rewrite URLs on the server, added to the fact that all recent browsers display URLs with characters instead of %-encoded URLs, but still not in the parameters of the URL after the "?". So it’s time to remove this "index.php".
To reconciliate MediaWiki URLs with recent browsers, we take advantage of the "path info" capability offered by servers (here nginx) and we configure MediaWiki such that it vastly limit the rendering of ugly URLs.
== Prerequisites ==
* [https://www.mediawiki.org MediaWiki], installed in the directory, say, '/var/www/mediawiki'
* [http://nginx.com nginx], preferably with the module Lua (package nginx-extras in Debian/Ubuntu)
* The wiki is assumed to be installed on "<nowiki>http://wiki.example.org/</nowiki>"
* The server must support the PATH_INFO directive; it is the case for most "nginx + PHP gateway" but you should really check it works before continuing, see [https://www.mediawiki.org/Special:MyLanguage/Manual:$wgUsePathInfo Manual:$wgUsePathInfo] on MediaWiki.org.
== MediaWiki configuration ==
It is assumed the wiki is directly served from the server root location instead of a subdirectory (e.g. <nowiki>"https://example.org/" instead of "https://example.org/tools/mywiki/"</nowiki>). In other words, the "root" directive in the nginx server is the directory itself where is installed MediaWiki (where index.php is).
The following configuration variables must be added at the end of the file LocalSettings.php, in MediaWiki directory.
1. Remove the "script path" to remove all web-visible subdirectories. This should be done accordingly with nginx configuration, or it could break the installed website.
$wgScriptPath = <nowiki>''</nowiki>;
2. Set the article path to its simplest form. With this, links leading to the 'view' action of the pages will be beautiful, instead of using "index.php". The server should support the "path info" capability —it’s the case of nginx.
$wgArticlePath = '/$1';
3. Now, true improvements begin. When you view an article, the URL is beautiful, but it becomes again ugly when you edit an article or ask its printable form. So let’s remove the "index.php".
$wgScript = <nowiki>''</nowiki>;
4. The links for the actions now have the form "/Main_Page?title=Main_Page&action=edit" for the edit action. There is still the "title=" parameter which should be removed since it is already displayed in the main part of the URL. To achieve that, we have to add a small hook in LocalSettings.php to remove the "title=" parameter.
$wgHooks['GetLocalURL::Internal'][] = 'phpAgnosticURL';
function phpAgnosticURL( $title, &$url, $query ) {
global $wgArticlePath;
$url = str_replace( '$1', wfUrlencode( $title->getPrefixedDBkey() ), $wgArticlePath );
while ( preg_match( '/^(.*&|)title=([^&]*)(&.*|)$/', $query, $matches ) ) {
$query = $matches[1] . $matches[3];
}
if ( $query != <nowiki>''</nowiki> ) {
$url = wfAppendQuery( $url, $query );
}
}
Basically, MediaWiki now generates beautiful URLs but nginx no more understand the URLs where there is no "title=" parameter. In the next part, we will retablish the functioning, we will completely hide the PHP system files (this improves security), and by the way permit the creation of page with almost all possible titles (e.g. you will be able to create the page "Index.php" on the wiki; it is probably useless^^, but perhaps you can be interested by titles "Skins/…").
== Nginx configuration ==
5. The basic skeleton is just below. 'location' directives will be added in the following.
server {
listen 80;
listen 443 ssl;
server_name wiki.example.org;
root /var/www/mediawiki;
# 'location' directives to be added thereafter
}
6. First, let’s add simple things: backend PHP scripts. We don’t search to hide them, they are backend so not viewed by human users, but machines must have access to these scripts.
location ~ ^/(api|load|opensearch_desc)\.php$ {
include php5-fpm.conf;
}
7. Next, the more important thing: the call to the hidden "index.php" to catch all actions and transmit them to MediaWiki. This use the PATH_INFO parameter of CGI scripts. Additionally, we add an exception for the situation where there is still a parameter "title="; it’s the case in MediaWiki forms (Special:Recentchanges, Special:Log, etc.) and it will make the whole system both backward-compatible and with beautiful URLs (a permanent redirect from the old URLs to the new URLs). The Lua rewriting part was done thanks to an [http://forum.nginx.org/read.php?2,243462,243464 agentzh’s message] (thanks!).
location / {
if ($arg_title != <nowiki>''</nowiki>) {
set_by_lua $mwredirect '
local args = ngx.var.args
local arg_title = ngx.var.arg_title
arg_title = ngx.re.gsub(arg_title, "%3A", ":")
arg_title = ngx.re.gsub(arg_title, "%20", "_")
arg_title = ngx.re.gsub(arg_title, "[+]", "_")
local url = "/" .. arg_title
newargs, n, err = ngx.re.gsub(args, [[\btitle=[^&]*&?]], "", "jo")
if string.len(newargs) > 0 then
url = url .. "?" ..newargs
end
if string.sub(url, -1) == "&" then
url = string.sub(url, 1, -2)
end
return url
';
return 301 $mwredirect;
}
include php5-fpm.conf;
fastcgi_split_path_info ^(/)(.*)$;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
8. Now, you should have a quite functional wiki, apart some missing images. Let’s add the UI images from the /skins subdirectory and the /extensions subdirectory at the same time (some extensions have JavaScript files or image files in their directories). Here are only allowed: the images, the JS files, the CSS and LESS files, and the .htc files (used by IE).
location ~ ^/(extensions|skins)/ {
location ~ \.(js|css|htc|less|png|svg|gif|jpg|xcf)$ {
allow all;
try_files $uri =403;
}
deny all;
}
9. Now we can allow integrated files of the /images subdirectory. Below are two variants depending if your wiki is public or private.
location ~ ^/images/ {
# Publicly accessible files
location ~ ^/images/(\.htaccess|README|lockdir.*)$ {
return 404;
}
location ~ /$ {
deny all;
}
try_files $uri =404;
# Private files for a private wiki
#include php5-fpm.conf;
#fastcgi_split_path_info ^(/images/)(.*)$;
#fastcgi_param SCRIPT_FILENAME $document_root/img_auth.php;
#fastcgi_param PATH_INFO $fastcgi_path_info;
}
10. To finish, we can add /robots.txt and /favicon.ico.
location ~ ^/(robots.txt|favicon.ico)$ {
try_files $uri =404;
}
== Complements ==
a. If you cannot install the Lua module in nginx, directly-entered old URLs (coming from external places like emails, other websites, user bookmarks, etc.) will work but will be displayed as old URLs ("/index.php?title=Main_Page&action=edit"). Once the user click on some link on the wiki, s/he will see new URLs.
b. To avoid MediaWiki to create URLs with remaining "title=" parameters, MediaWiki core should be patched in many places: in all forms where there is a <nowiki><input type="hidden" name="title" … /></nowiki> HTML tag and possibly in other places. Possibly some bug should be created, at least to give an option to natively create beautiful URLs.
c. MediaWiki update maintenance: nothing from the MediaWiki configuration side, apart if you modify MediaWiki core (it is not recommanded to facilitate updates). Probably the changed configuration parameters will stay backward-compatible for some long time since most were introduced in pre 1.1.0 MediaWiki versions. Possibly some PHP scripts must be added in the point 6 in future MediaWiki releases, see the entry points in your Special:Version page or on [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org. Possibly you can want to change the files enumerated in point 9 (this list is better from a security point of view, but this requires maintenance over time).
d. The nginx configuration above was done with strict security considerations in order to remove all entry points to system files, but this requires maintenance over time. You can want to soften these security checks:
# add more PHP scripts in point 6, see [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org
# add more media files extensions in point 8, or even acess all files in the "extensions" and "skins" subdirectories, or at the contrary blacklist some file extensions (e.g. mainly .php files)
# remove the list of files in point 9, this is probably harmless from a security point of view
e. The list in point 10 could be changed depending of specific needs. For example, you could change the location of the favicon (see [https://www.mediawiki.org/wiki/Manual:$wgFavicon $wgFavicon]), or you can add a file /sitemap.xml, etc. Additionally some MediaWiki extensions or core features propose to manage some "metadata system files" like /robots.txt or /sitemap.xml; if you want to use these features, you could have to create other "location" in nginx configuration with some wrapper to PHP file, similarly to the wrapper for "/images/" in the case of a private wiki.
f. As of MediaWiki 1.23, the entry points on the page Special:Version will show "[ ]" for "index.php", this can be considered a ''bug'': the case where "index.php" is completely removed is not expected :)
== Conclusion ==
# Now the URLs are "/Main_Page", "/Main_Page?action=history", "/Main_Page?printable=yes", etc.
# Non-latin alphabets benefit of the "real characters" rendering of the browser in the URL
# The system is backward-compatible with existing URLs, and old URLs are rewritten if you have installed the Lua part in the nginx configuration.
# Your articles can have a wide range of titles and are not limited by system files, e.g. you can write articles about "Robots.txt", "Images", "Skins", or "Index.php" (NB: the initial capital).
# Except whitelisted system files and subdirectories, nobody can access to the underlying system files: e.g. "includes/Title.php" is considered as an article, as well as "LocalSettings.php", hence an attacker does not have a direct access to the system files and s/he will have to deal with MediaWiki before attacking PHP files.
847a0f2deb11aa724d23cadf132a49f19625a162
206
205
2015-03-17T13:10:15Z
Seb35
1
one more thing to consider
wikitext
text/x-wiki
{{Tutorial|lang=en|status=stable}}
This page is about configurating beautiful and pure URLs for MediaWiki, basically without any visible "index.php". For example:
<div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;">
:[{{SERVER}}/{{FULLPAGENAMEE}}?action=edit http://{{SERVERNAME}}/{{FULLPAGENAMEE}}?action=edit]
''instead of''
:[{{SERVER}}/index.php?title={{FULLPAGENAMEE}}&action=edit http://{{SERVERNAME}}/index.php?title={{FULLPAGENAMEE}}&action=edit]
</div>
and it is even better in languages with non-latin alphabets:
<div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;">
:[{{SERVER}}/维基百科?action=history http://{{SERVERNAME}}/维基百科?action=history]
''instead of''
:[{{SERVER}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history http://{{SERVERNAME}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history]
</div>
== Rationale and introduction ==
The reasoning behind this is: The syntax "index.php" is not interesting from the user’s point of view so it shouldn’t be there; additionally the user should (want) to see understandable page names instead of %-encoded nonsense.
You can see on this wiki these rules in action. Technically, these ugly URLs come from good’ ol’ time’ of [[:enwikipedia:Common Gateway Interface|CGI scripts]] (ten years ago), but now —and since some time— it is possible to rewrite URLs on the server, added to the fact that all recent browsers display URLs with characters instead of %-encoded URLs, but still not in the parameters of the URL after the "?". So it’s time to remove this "index.php".
To reconciliate MediaWiki URLs with recent browsers, we take advantage of the "path info" capability offered by servers (here nginx) and we configure MediaWiki such that it vastly limit the rendering of ugly URLs.
== Prerequisites ==
* [https://www.mediawiki.org MediaWiki], installed in the directory, say, '/var/www/mediawiki'
* [http://nginx.com nginx], preferably with the module Lua (package nginx-extras in Debian/Ubuntu)
* The wiki is assumed to be installed on "<nowiki>http://wiki.example.org/</nowiki>"
* The server must support the PATH_INFO directive; it is the case for most "nginx + PHP gateway" but you should really check it works before continuing, see [https://www.mediawiki.org/Special:MyLanguage/Manual:$wgUsePathInfo Manual:$wgUsePathInfo] on MediaWiki.org.
== MediaWiki configuration ==
It is assumed the wiki is directly served from the server root location instead of a subdirectory (e.g. <nowiki>"https://example.org/" instead of "https://example.org/tools/mywiki/"</nowiki>). In other words, the "root" directive in the nginx server is the directory itself where is installed MediaWiki (where index.php is).
The following configuration variables must be added at the end of the file LocalSettings.php, in MediaWiki directory.
1. Remove the "script path" to remove all web-visible subdirectories. This should be done accordingly with nginx configuration, or it could break the installed website.
$wgScriptPath = <nowiki>''</nowiki>;
2. Set the article path to its simplest form. With this, links leading to the 'view' action of the pages will be beautiful, instead of using "index.php". The server should support the "path info" capability —it’s the case of nginx.
$wgArticlePath = '/$1';
3. Now, true improvements begin. When you view an article, the URL is beautiful, but it becomes again ugly when you edit an article or ask its printable form. So let’s remove the "index.php".
$wgScript = <nowiki>''</nowiki>;
4. The links for the actions now have the form "/Main_Page?title=Main_Page&action=edit" for the edit action. There is still the "title=" parameter which should be removed since it is already displayed in the main part of the URL. To achieve that, we have to add a small hook in LocalSettings.php to remove the "title=" parameter.
$wgHooks['GetLocalURL::Internal'][] = 'phpAgnosticURL';
function phpAgnosticURL( $title, &$url, $query ) {
global $wgArticlePath;
$url = str_replace( '$1', wfUrlencode( $title->getPrefixedDBkey() ), $wgArticlePath );
while ( preg_match( '/^(.*&|)title=([^&]*)(&.*|)$/', $query, $matches ) ) {
$query = $matches[1] . $matches[3];
}
if ( $query != <nowiki>''</nowiki> ) {
$url = wfAppendQuery( $url, $query );
}
}
Basically, MediaWiki now generates beautiful URLs but nginx no more understand the URLs where there is no "title=" parameter. In the next part, we will retablish the functioning, we will completely hide the PHP system files (this improves security), and by the way permit the creation of page with almost all possible titles (e.g. you will be able to create the page "Index.php" on the wiki; it is probably useless^^, but perhaps you can be interested by titles "Skins/…").
== Nginx configuration ==
5. The basic skeleton is just below. 'location' directives will be added in the following.
server {
listen 80;
listen 443 ssl;
server_name wiki.example.org;
root /var/www/mediawiki;
# 'location' directives to be added thereafter
}
6. First, let’s add simple things: backend PHP scripts. We don’t search to hide them, they are backend so not viewed by human users, but machines must have access to these scripts.
location ~ ^/(api|load|opensearch_desc)\.php$ {
include php5-fpm.conf;
}
7. Next, the more important thing: the call to the hidden "index.php" to catch all actions and transmit them to MediaWiki. This use the PATH_INFO parameter of CGI scripts. Additionally, we add an exception for the situation where there is still a parameter "title="; it’s the case in MediaWiki forms (Special:Recentchanges, Special:Log, etc.) and it will make the whole system both backward-compatible and with beautiful URLs (a permanent redirect from the old URLs to the new URLs). The Lua rewriting part was done thanks to an [http://forum.nginx.org/read.php?2,243462,243464 agentzh’s message] (thanks!).
location / {
if ($arg_title != <nowiki>''</nowiki>) {
set_by_lua $mwredirect '
local args = ngx.var.args
local arg_title = ngx.var.arg_title
arg_title = ngx.re.gsub(arg_title, "%3A", ":")
arg_title = ngx.re.gsub(arg_title, "%20", "_")
arg_title = ngx.re.gsub(arg_title, "[+]", "_")
local url = "/" .. arg_title
newargs, n, err = ngx.re.gsub(args, [[\btitle=[^&]*&?]], "", "jo")
if string.len(newargs) > 0 then
url = url .. "?" ..newargs
end
if string.sub(url, -1) == "&" then
url = string.sub(url, 1, -2)
end
return url
';
return 301 $mwredirect;
}
include php5-fpm.conf;
fastcgi_split_path_info ^(/)(.*)$;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
8. Now, you should have a quite functional wiki, apart some missing images. Let’s add the UI images from the /skins subdirectory and the /extensions subdirectory at the same time (some extensions have JavaScript files or image files in their directories). Here are only allowed: the images, the JS files, the CSS and LESS files, and the .htc files (used by IE).
location ~ ^/(extensions|skins)/ {
location ~ \.(js|css|htc|less|png|svg|gif|jpg|xcf)$ {
allow all;
try_files $uri =403;
}
deny all;
}
9. Now we can allow integrated files of the /images subdirectory. Below are two variants depending if your wiki is public or private.
location ~ ^/images/ {
# Publicly accessible files
location ~ ^/images/(\.htaccess|README|lockdir.*)$ {
return 404;
}
location ~ /$ {
deny all;
}
try_files $uri =404;
# Private files for a private wiki
#include php5-fpm.conf;
#fastcgi_split_path_info ^(/images/)(.*)$;
#fastcgi_param SCRIPT_FILENAME $document_root/img_auth.php;
#fastcgi_param PATH_INFO $fastcgi_path_info;
}
10. To finish, we can add /robots.txt and /favicon.ico.
location ~ ^/(robots.txt|favicon.ico)$ {
try_files $uri =404;
}
== Complements ==
a. If you cannot install the Lua module in nginx, directly-entered old URLs (coming from external places like emails, other websites, user bookmarks, etc.) will work but will be displayed as old URLs ("/index.php?title=Main_Page&action=edit"). Once the user click on some link on the wiki, s/he will see new URLs.
b. To avoid MediaWiki to create URLs with remaining "title=" parameters, MediaWiki core should be patched in many places: in all forms where there is a <nowiki><input type="hidden" name="title" … /></nowiki> HTML tag and possibly in other places. Possibly some bug should be created, at least to give an option to natively create beautiful URLs.
c. MediaWiki update maintenance: nothing from the MediaWiki configuration side, apart if you modify MediaWiki core (it is not recommanded to facilitate updates). Probably the changed configuration parameters will stay backward-compatible for some long time since most were introduced in pre 1.1.0 MediaWiki versions. Possibly some PHP scripts must be added in the point 6 in future MediaWiki releases, see the entry points in your Special:Version page or on [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org. Possibly you can want to change the files enumerated in point 9 (this list is better from a security point of view, but this requires maintenance over time).
d. The nginx configuration above was done with strict security considerations in order to remove all entry points to system files, but this requires maintenance over time. You can want to soften these security checks:
# add more PHP scripts in point 6, see [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org
# add more media files extensions in point 8, or even acess all files in the "extensions" and "skins" subdirectories, or at the contrary blacklist some file extensions (e.g. mainly .php files)
# remove the list of files in point 9, this is probably harmless from a security point of view
e. The list in point 10 could be changed depending of specific needs. For example, you could change the location of the favicon (see [https://www.mediawiki.org/wiki/Manual:$wgFavicon $wgFavicon]), or you can add a file /sitemap.xml, etc. Additionally some MediaWiki extensions or core features propose to manage some "metadata system files" like /robots.txt or /sitemap.xml; if you want to use these features, you could have to create other "location" in nginx configuration with some wrapper to PHP file, similarly to the wrapper for "/images/" in the case of a private wiki.
f. As of MediaWiki 1.23, the entry points on the page Special:Version will show "[ ]" for "index.php", this can be considered a ''bug'': the case where "index.php" is completely removed is not expected :)
g. An easier way to remove most of the index.php is to use [[:mw:Manual:$wgActionPaths|$wgActionPaths]]. With this configuration setting, the 'edit' action on this page would be <tt>[{{SERVER}}/edit/{{FULLPAGENAMEE}} http://{{SERVERNAME}}/edit/{{FULLPAGENAMEE}}]</tt> instead of <tt>[{{SERVER}}/{{FULLPAGENAMEE}}?action=edit http://{{SERVERNAME}}/{{FULLPAGENAMEE}}?action=edit]</tt>. I have no opinion on what is better. It can be kept in mind that some browsers might remove the address part after the "?"; in these browsers, the action would or would not be displayed. Note : how does MediaWiki react with $wgActionPaths when there are (e.g.) "action=edit" and "section=0": is it "/edit/Title?section=0" or "/index.php?title=Title&action=edit§ion=0"?
== Conclusion ==
# Now the URLs are "/Main_Page", "/Main_Page?action=history", "/Main_Page?printable=yes", etc.
# Non-latin alphabets benefit of the "real characters" rendering of the browser in the URL
# The system is backward-compatible with existing URLs, and old URLs are rewritten if you have installed the Lua part in the nginx configuration.
# Your articles can have a wide range of titles and are not limited by system files, e.g. you can write articles about "Robots.txt", "Images", "Skins", or "Index.php" (NB: the initial capital).
# Except whitelisted system files and subdirectories, nobody can access to the underlying system files: e.g. "includes/Title.php" is considered as an article, as well as "LocalSettings.php", hence an attacker does not have a direct access to the system files and s/he will have to deal with MediaWiki before attacking PHP files.
03570137c0bdf1de0f81eeba154fcb9ac854b005
Présentation:Wikis
104
98
208
2015-04-09T10:30:00Z
Seb35
1
{{subst:ns:}}
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
Présentation:Wikis/1
104
99
209
2015-04-09T10:30:40Z
Seb35
1
init
wikitext
text/x-wiki
da39a3ee5e6b4b0d3255bfef95601890afd80709
MediaWiki:Common.css
8
4
210
34
2015-04-09T10:44:18Z
Seb35
1
Espace de noms Présentation avec un style « diapositives », première itération
css
text/css
/* Contenu en couleur noire et non grise */
div#content {
color: black;
}
/* Code en couleur grise */
pre, code, tt, kbd, samp, .mw-code {
color: #252525;
}
/* Espace de noms Présentation avec un style « diapositives » */
.ns-104 {
background: white;
}
.ns-104 #mw-page-base, .ns-104 #mw-head-base, .ns-104 #mw-navigation, .ns-104 #footer {
display: none;
}
.ns-104 #content {
width: 90%;
margin: 2% auto;
padding: 1em;
border: 1px solid #A7D7F9;
}
e47c67b705b1a96709c6f62399bd5f0206a92018
214
210
2015-04-09T11:18:25Z
Seb35
1
diapo uniquement lors de la visualisation, pas lors de l’édition ou autre
css
text/css
/* Contenu en couleur noire et non grise */
div#content {
color: black;
}
/* Code en couleur grise */
pre, code, tt, kbd, samp, .mw-code {
color: #252525;
}
/* Espace de noms Présentation avec un style « diapositives » */
.ns-104.action-view {
background: white;
}
.ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer {
display: none;
}
.ns-104.action-view #content {
width: 90%;
margin: 2% auto;
padding: 1em;
border: 1px solid #A7D7F9;
}
154e0850969bba391dc07a76bc54668b21f7d3c6
Modèle:Présentation
10
100
211
2015-04-09T11:10:53Z
Seb35
1
première version
wikitext
text/x-wiki
<div id="presentation-bar">
<div id="arrows">
[[Fichier:Arrow Blue Left 001.svg|link={{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}}}
[[Fichier:Arrow Blue Right 001.svg|link={{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}}}
</div>
<div id="edit" class="plainlinks">[{{fullurl:{{FULLPAGENAME}}|action=edit}} {{int:edit}}]</div>
<div id="counter">{{SUBPAGENAME}}/{{{total|10}}}</div>
</div>
3f5f489d64cc35351cf2be5c30d81a93d5e339a0
212
211
2015-04-09T11:12:55Z
Seb35
1
syntaxe
wikitext
text/x-wiki
<div id="presentation-bar">
<div id="arrows">
[[Fichier:Arrow Blue Left 001.svg|link={{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}}}]]
[[Fichier:Arrow Blue Right 001.svg|link={{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}}}]]
</div>
<div id="edit" class="plainlinks">[{{fullurl:{{FULLPAGENAME}}|action=edit}} {{int:edit}}]</div>
<div id="counter">{{SUBPAGENAME}}/{{{total|10}}}</div>
</div>
20be2392f94d849b74a1f0123872936e98e44727
213
212
2015-04-09T11:13:28Z
Seb35
1
syntaxe
wikitext
text/x-wiki
<div id="presentation-bar">
<div id="arrows">
[[Fichier:Arrow Blue Left 001.svg|link={{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}]]
[[Fichier:Arrow Blue Right 001.svg|link={{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}]]
</div>
<div id="edit" class="plainlinks">[{{fullurl:{{FULLPAGENAME}}|action=edit}} {{int:edit}}]</div>
<div id="counter">{{SUBPAGENAME}}/{{{total|10}}}</div>
</div>
320c226ce3ae10c9ed80fb658ca5de042f0ce449
Modèle:Présentation
10
100
215
213
2015-04-09T11:21:42Z
Seb35
1
taille icônes
wikitext
text/x-wiki
<div id="presentation-bar">
<div id="arrows">
[[Fichier:Arrow Blue Left 001.svg|25px<includeonly>|link={{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}</includeonly>]]
[[Fichier:Arrow Blue Right 001.svg|25px<includeonly>|link={{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}</includeonly>]]
</div>
<div id="edit" class="plainlinks">[{{fullurl:{{FULLPAGENAME}}|action=edit}} {{int:edit}}]</div>
<div id="counter">{{SUBPAGENAME}}/{{{total|10}}}</div>
</div>
5a582580293f262f3b776622dfb97c848c910184
216
215
2015-04-09T12:05:49Z
Seb35
1
plus de logique pour ne pas afficher des liens inexistants
wikitext
text/x-wiki
<div id="presentation-bar">
<div id="arrows">
[[Fichier:Arrow Blue Left 001.svg|25px|link={{#iferror:{{#expr:{{SUBPAGENAME}}-1}}||{{#ifexists:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}|{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}}}}}]]
[[Fichier:Arrow Blue Right 001.svg|25px|link={{#iferror:{{#expr:{{SUBPAGENAME}}+1}}||{{#ifexists:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}|{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}}}}}]]
</div>
<div id="edit" class="plainlinks">[{{fullurl:{{FULLPAGENAME}}|action=edit}} {{int:edit}}]</div>
<div id="counter">{{SUBPAGENAME}}/{{{total|10}}}</div>
</div>
f8aa4f4fd09b6332a7d2cc8b1cb96a87d75f5411
217
216
2015-04-09T12:08:52Z
Seb35
1
syntaxe
wikitext
text/x-wiki
<div id="presentation-bar">
<div id="arrows">
[[Fichier:Arrow Blue Left 001.svg|25px|link={{#iferror:{{#expr:{{SUBPAGENAME}}-1}}||{{#ifexist:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}|{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}}}}}]]
[[Fichier:Arrow Blue Right 001.svg|25px|link={{#iferror:{{#expr:{{SUBPAGENAME}}+1}}||{{#ifexist:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}|{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}}}}}]]
</div>
<div id="edit" class="plainlinks">[{{fullurl:{{FULLPAGENAME}}|action=edit}} {{int:edit}}]</div>
<div id="counter">{{SUBPAGENAME}}/{{{total|10}}}</div>
</div>
dd1182dab0c615523534ccbcaaebff72a8c2302b
219
217
2015-04-09T12:15:04Z
Seb35
1
ne pas afficher les flèches si on est au début ou à la fin
wikitext
text/x-wiki
<div id="presentation-bar">
<div id="arrows">
<span style="{{#iferror:{{#expr:{{SUBPAGENAME}}-1}}|visibility:hidden;|{{#ifexist:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Left 001.svg|25px|link={{#iferror:{{#expr:{{SUBPAGENAME}}-1}}||{{#ifexist:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}|{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}}}}}]]</span>
<span style="{{#iferror:{{#expr:{{SUBPAGENAME}}+1}}|visibility:hidden;|{{#ifexist:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Right 001.svg|25px|link={{#iferror:{{#expr:{{SUBPAGENAME}}+1}}||{{#ifexist:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}|{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}}}}}]]</span>
</div>
<div id="edit" class="plainlinks">[{{fullurl:{{FULLPAGENAME}}|action=edit}} {{int:edit}}]</div>
<div id="counter">{{SUBPAGENAME}}/{{{total|10}}}</div>
</div>
a7c8887dcf83da3c2123a757acf635166d7d5dcd
222
219
2015-04-09T12:17:54Z
Seb35
1
debug
wikitext
text/x-wiki
<div id="presentation-bar">
<div id="arrows">
<div style="">[[Fichier:Arrow Blue Left 001.svg|25px|link={{#iferror:{{#expr:{{SUBPAGENAME}}-1}}||{{#ifexist:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}|{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}}}}}]]</div>
<div style="">[[Fichier:Arrow Blue Right 001.svg|25px|link={{#iferror:{{#expr:{{SUBPAGENAME}}+1}}||{{#ifexist:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}|{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}}}}}]]</div>
</div>
<div id="edit" class="plainlinks">[{{fullurl:{{FULLPAGENAME}}|action=edit}} {{int:edit}}]</div>
<div id="counter">{{SUBPAGENAME}}/{{{total|10}}}</div>
</div>
9ca31908590f9fea33f81cbd9f813df66610a17c
223
222
2015-04-09T12:26:39Z
Seb35
1
bien sûr…
wikitext
text/x-wiki
<div id="presentation-bar">
<div id="arrows">
<span style="{{#iferror:{{#expr:{{SUBPAGENAME}}-1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Left 001.svg|25px|link={{#iferror:{{#expr:{{SUBPAGENAME}}-1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}}}}}]]</span>
<span style="{{#iferror:{{#expr:{{SUBPAGENAME}}+1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Right 001.svg|25px|link={{#iferror:{{#expr:{{SUBPAGENAME}}+1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}}}}}]]</span>
</div>
<div id="edit" class="plainlinks">[{{fullurl:{{FULLPAGENAME}}|action=edit}} {{int:edit}}]</div>
<div id="counter">{{SUBPAGENAME}}/{{{total|10}}}</div>
</div>
fa0d4a8f6301be05cc2d4a2aae4aabf58ab71e1a
224
223
2015-04-09T13:08:47Z
Seb35
1
wikitext
text/x-wiki
<div id="presentation-bar">
<div id="presentation-bar-edit" class="plainlinks">[{{fullurl:{{FULLPAGENAME}}|action=edit}} {{int:edit}}]</div>
<div id="presentation-bar-arrows">
<span style="{{#iferror:{{#expr:{{SUBPAGENAME}}-1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Left 001.svg|25px|link={{#iferror:{{#expr:{{SUBPAGENAME}}-1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}}}}}]]</span>
<span style="{{#iferror:{{#expr:{{SUBPAGENAME}}+1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Right 001.svg|25px|link={{#iferror:{{#expr:{{SUBPAGENAME}}+1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}}}}}]]</span>
</div>
<div id="presentation-bar-counter">{{SUBPAGENAME}}/{{{total|10}}}</div>
</div>
ec4a5f3352dc29d40247a10ce747a2d593fa62cc
225
224
2015-04-09T13:22:33Z
Seb35
1
mise en page
wikitext
text/x-wiki
<div id="presentation-bar">
<div id="presentation-bar-edit" class="plainlinks" style="float: left;">[{{fullurl:{{FULLPAGENAME}}|action=edit}} {{int:edit}}]</div>
<div id="presentation-bar-right" style="float: right;">
<span style="{{#iferror:{{#expr:{{SUBPAGENAME}}-1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Left 001.svg|25px|link={{#iferror:{{#expr:{{SUBPAGENAME}}-1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}}}}}]]</span>
<span style="{{#iferror:{{#expr:{{SUBPAGENAME}}+1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Right 001.svg|25px|link={{#iferror:{{#expr:{{SUBPAGENAME}}+1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}}}}}]]</span>
{{SUBPAGENAME}}/{{{total|10}}}
</div>
</div>
7b6bc4628278ce734e212f3fa55d06cb33d1e600
226
225
2015-04-09T13:24:39Z
Seb35
1
mise en page
wikitext
text/x-wiki
<div id="presentation-bar">
<p class="plainlinks" style="float: left;">[{{fullurl:{{FULLPAGENAME}}|action=edit}} {{int:edit}}]</p>
<p style="float: right;">
<span style="{{#iferror:{{#expr:{{SUBPAGENAME}}-1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Left 001.svg|25px|link={{#iferror:{{#expr:{{SUBPAGENAME}}-1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}}}}}]]</span>
<span style="{{#iferror:{{#expr:{{SUBPAGENAME}}+1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Right 001.svg|25px|link={{#iferror:{{#expr:{{SUBPAGENAME}}+1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}}}}}]]</span>
{{SUBPAGENAME}}/{{{total|10}}}
</p>
</div>
e8eb10db73e71cffb18321eb8c986030180114d8
232
226
2015-04-09T14:23:23Z
Seb35
1
séparation en deux parties gauche et droit
wikitext
text/x-wiki
<div id="presentation-bar-left" class="presentation-base plainlinks">
<p>[{{fullurl:{{FULLPAGENAME}}|action=edit}} {{int:edit}}] [[{{NAMESPACE}}:{{BASEPAGENAME}}|{{BASEPAGENAME}}]]</p>
</div>
<div id="presentation-bar-right" class="presentation-base">
<p>
<span style="{{#iferror:{{#expr:{{SUBPAGENAME}}-1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Left 001.svg|20px|link={{#iferror:{{#expr:{{SUBPAGENAME}}-1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}}}}}]]</span>
<span style="{{#iferror:{{#expr:{{SUBPAGENAME}}+1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Right 001.svg|20px|link={{#iferror:{{#expr:{{SUBPAGENAME}}+1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}}}}}]]</span>
{{SUBPAGENAME}}/{{{total|10}}}
</p>
</div>
e851b51a4f5ccc0ed148bf6217ffd70f8536e821
235
232
2015-04-09T14:35:03Z
Seb35
1
inversion liens titre et modifier
wikitext
text/x-wiki
<div id="presentation-bar-left" class="presentation-bar plainlinks">
<p>[[{{NAMESPACE}}:{{BASEPAGENAME}}|{{BASEPAGENAME}}]] – [{{fullurl:{{FULLPAGENAME}}|action=edit}} {{lc:{{int:edit}}}}]</p>
</div>
<div id="presentation-bar-right" class="presentation-base">
<p>
<span style="{{#iferror:{{#expr:{{SUBPAGENAME}}-1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Left 001.svg|18px|link={{#iferror:{{#expr:{{SUBPAGENAME}}-1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}}}}}]]</span>
<span style="{{#iferror:{{#expr:{{SUBPAGENAME}}+1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Right 001.svg|18px|link={{#iferror:{{#expr:{{SUBPAGENAME}}+1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}}}}}]]</span>
{{SUBPAGENAME}}/{{{total|10}}}
</p>
</div>
f8f0a1885009f39fc75e41d777ffaee4de5d9e91
236
235
2015-04-09T14:38:46Z
Seb35
1
couleur lien
wikitext
text/x-wiki
<div id="presentation-bar-left" class="presentation-bar plainlinks">
<p>[[{{NAMESPACE}}:{{BASEPAGENAME}}|{{BASEPAGENAME}}]] – [{{fullurl:{{FULLPAGENAME}}|action=edit}} <span style="color:#0B0080;">{{lc:{{int:edit}}}}]</span></p>
</div>
<div id="presentation-bar-right" class="presentation-base">
<p>
<span style="{{#iferror:{{#expr:{{SUBPAGENAME}}-1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Left 001.svg|18px|link={{#iferror:{{#expr:{{SUBPAGENAME}}-1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}}}}}]]</span>
<span style="{{#iferror:{{#expr:{{SUBPAGENAME}}+1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Right 001.svg|18px|link={{#iferror:{{#expr:{{SUBPAGENAME}}+1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}}}}}]]</span>
{{SUBPAGENAME}}/{{{total|10}}}
</p>
</div>
65f145a7cb0d01d64b2c011605be5208bedcc7ca
237
236
2015-04-09T14:40:04Z
Seb35
1
couleur lien
wikitext
text/x-wiki
<div id="presentation-bar-left" class="presentation-bar plainlinks">
<p>[[{{NAMESPACE}}:{{BASEPAGENAME}}|{{BASEPAGENAME}}]] – [{{fullurl:{{FULLPAGENAME}}|action=edit}} <span style="color:#0645AD;">{{lc:{{int:edit}}}}]</span></p>
</div>
<div id="presentation-bar-right" class="presentation-base">
<p>
<span style="{{#iferror:{{#expr:{{SUBPAGENAME}}-1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Left 001.svg|18px|link={{#iferror:{{#expr:{{SUBPAGENAME}}-1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}}}}}]]</span>
<span style="{{#iferror:{{#expr:{{SUBPAGENAME}}+1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Right 001.svg|18px|link={{#iferror:{{#expr:{{SUBPAGENAME}}+1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}}}}}]]</span>
{{SUBPAGENAME}}/{{{total|10}}}
</p>
</div>
92d1d150174314ce3927d9a97757314a5d0eef2a
238
237
2015-04-09T14:47:37Z
Seb35
1
tailles
wikitext
text/x-wiki
<div id="presentation-bar-left" class="presentation-bar plainlinks">
<p>[[{{NAMESPACE}}:{{BASEPAGENAME}}|{{BASEPAGENAME}}]] – [{{fullurl:{{FULLPAGENAME}}|action=edit}} <span style="color:#0645AD;">{{lc:{{int:edit}}}}]</span></p>
</div>
<div id="presentation-bar-right" class="presentation-bar">
<p>
<span style="{{#iferror:{{#expr:{{SUBPAGENAME}}-1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Left 001.svg|15px|link={{#iferror:{{#expr:{{SUBPAGENAME}}-1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}}}}}]]</span>
<span style="{{#iferror:{{#expr:{{SUBPAGENAME}}+1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Right 001.svg|15px|link={{#iferror:{{#expr:{{SUBPAGENAME}}+1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}}}}}]]</span>
{{SUBPAGENAME}}/{{{total|10}}}
</p>
</div>
aea38035f2d23bad9e4e235ad98ef8bb38d664e0
242
238
2015-04-09T19:44:48Z
Seb35
1
couleur
wikitext
text/x-wiki
<div id="presentation-bar-left" class="presentation-bar plainlinks">
<p>[[{{NAMESPACE}}:{{BASEPAGENAME}}|<span style="color:#0645AD;">{{BASEPAGENAME}}</span>]] – [{{fullurl:{{FULLPAGENAME}}|action=edit}} <span style="color:#0645AD;">{{lc:{{int:edit}}}}]</span></p>
</div>
<div id="presentation-bar-right" class="presentation-bar">
<p>
<span style="{{#iferror:{{#expr:{{SUBPAGENAME}}-1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Left 001.svg|15px|link={{#iferror:{{#expr:{{SUBPAGENAME}}-1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}}}}}]]</span>
<span style="{{#iferror:{{#expr:{{SUBPAGENAME}}+1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Right 001.svg|15px|link={{#iferror:{{#expr:{{SUBPAGENAME}}+1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}}}}}]]</span>
{{SUBPAGENAME}}/{{{total|10}}}
</p>
</div>
66634a4ae55e44045cf82a82101f63b07030458d
249
242
2015-04-09T21:37:48Z
Seb35
1
+displaytitle, +exemple de gestion des sous-pages pour la fonction "Suivant"
wikitext
text/x-wiki
<div id="presentation-bar-left" class="presentation-bar plainlinks">
<p>[[{{NAMESPACE}}:{{BASEPAGENAME}}|<span style="color:#0645AD;">{{BASEPAGENAME}}</span>]] – [{{fullurl:{{FULLPAGENAME}}|action=edit}} <span style="color:#0645AD;">{{lc:{{int:edit}}}}]</span></p>
</div>
<div id="presentation-bar-right" class="presentation-bar">
<p>
<span style="{{#iferror:{{#expr:{{SUBPAGENAME}}-1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Left 001.svg|15px|link={{#iferror:{{#expr:{{SUBPAGENAME}}-1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}-1}}}}}}]]</span>
<span style="{{#iferror:{{#expr:{{SUBPAGENAME}}+1}}|visibility:hidden;|{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}||visibility:hidden;}}}}">[[Fichier:Arrow Blue Right 001.svg|15px|link={{#iferror:{{#expr:{{SUBPAGENAME}}+1}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}}}}}]]</span>
{{SUBPAGENAME}}/{{{total|10}}}
</p>
</div>
{{#if:{{{1|}}}|{{DISPLAYTITLE:{{{1}}}}}}}<!--
Lorqu’on est dans une sous-page (e.g. Présentation:Foo/2/3), rechercher la page suivante entre :
- Présentation:Foo/2/4
- Présentation:Foo/3
- Présentation:Foo/3/0
- Présentation:Foo/3/1
[[Fichier:Arrow Blue Right 001.svg|15px|link={{#ifeq:{{BASEPAGENAME}}|{{ROOTPAGENAME}}||{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}|{{NAMESPACE}}:{{BASEPAGENAME}}/{{#expr:{{SUBPAGENAME}}+1}}|{{#ifexist:{{#titleparts:{{FULLPAGENAME}}|-2}}/{{#expr:{{#titleparts:{{FULLPAGENAME}}|-1|-2}}+1}}|{{#titleparts:{{FULLPAGENAME}}|-2}}/{{#expr:{{#titleparts:{{FULLPAGENAME}}|-1|-2}}+1}}|{{#ifexist:{{#titleparts:{{FULLPAGENAME}}|-2}}/{{#expr:{{#titleparts:{{FULLPAGENAME}}|-1|-2}}+1}}/0|{{#titleparts:{{FULLPAGENAME}}|-2}}/{{#expr:{{#titleparts:{{FULLPAGENAME}}|-1|-2}}+1}}/0|{{#ifexist:{{#titleparts:{{FULLPAGENAME}}|-2}}/{{#expr:{{#titleparts:{{FULLPAGENAME}}|-1|-2}}+1}}/1|{{#titleparts:{{FULLPAGENAME}}|-2}}/{{#expr:{{#titleparts:{{FULLPAGENAME}}|-1|-2}}+1}}/1}}}}}}}}}}]]
Ce raisonnement n’est pas possible pour la fonction "Prédédent" car on ne sait pas combien il y avait de diapos dans la section précédent.
-->
6776e9965e689b29f0d66123bc52a5e6dc58f6fb
Présentation:Wikis/1
104
99
218
209
2015-04-09T12:09:10Z
Seb35
1
wikitext
text/x-wiki
{{Présentation}}
c72c7716fa99f66d2e9e15d3594b2529de6625b2
227
218
2015-04-09T13:40:04Z
Seb35
1
wikitext
text/x-wiki
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. Cras elementum ultrices diam. Maecenas ligula massa, varius a, semper congue, euismod non, mi. Proin porttitor, orci nec nonummy molestie, enim est eleifend mi, non fermentum diam nisl sit amet erat. Duis semper. Duis arcu massa, scelerisque vitae, consequat in, pretium a, enim. Pellentesque congue. Ut in risus volutpat libero pharetra tempor. Cras vestibulum bibendum augue. Praesent egestas leo in pede. Praesent blandit odio eu enim. Pellentesque sed dui ut augue blandit sodales. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aliquam nibh. Mauris ac mauris sed pede pellentesque fermentum. Maecenas adipiscing ante non diam sodales hendrerit.
Ut velit mauris, egestas sed, gravida nec, ornare ut, mi. Aenean ut orci vel massa suscipit pulvinar. Nulla sollicitudin. Fusce varius, ligula non tempus aliquam, nunc turpis ullamcorper nibh, in tempus sapien eros vitae ligula. Pellentesque rhoncus nunc et augue. Integer id felis. Curabitur aliquet pellentesque diam. Integer quis metus vitae elit lobortis egestas. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi vel erat non mauris convallis vehicula. Nulla et sapien. Integer tortor tellus, aliquam faucibus, convallis id, congue eu, quam. Mauris ullamcorper felis vitae erat. Proin feugiat, augue non elementum posuere, metus purus iaculis lectus, et tristique ligula justo vitae magna.
Aliquam convallis sollicitudin purus. Praesent aliquam, enim at fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, felis magna fermentum augue, et ultricies lacus lorem varius purus. Curabitur eu amet.
{{DISPLAYTITLE:Définition d’un wiki}}
{{Présentation}}
5d119be37bb45e5ca077e43dc51566017b9093f3
Présentation:Wikis/1/1
104
101
220
2015-04-09T12:15:26Z
Seb35
1
init
wikitext
text/x-wiki
{{Presentation}}
1f488ee887a86db329e5995c5eae0fd6663d4e24
221
220
2015-04-09T12:15:47Z
Seb35
1
init
wikitext
text/x-wiki
{{Présentation}}
c72c7716fa99f66d2e9e15d3594b2529de6625b2
240
221
2015-04-09T15:09:45Z
Seb35
1
init
wikitext
text/x-wiki
<span style="color:#9B85BE;">WIKI</span>
[[Fichier:Tamponsmots wiki.jpg|left]]
<span style="color:#9B85BE;">DÉFINITION(S)</span>
Wiki [wiki] n. m. – ÉTYM. 2003, mot anglais américain, abréviation de WikiWikiWeb, nom du site créé par W. Cunningham en 1995, de l’hawaïen wiki wiki « vite »
Site web collaboratif dont le contenu peut être librement modifié par les visiteurs autorisés. Le développement des wikis. APPOS. Site, encyclopédie wiki.
<span style="color:#9B85BE;">ORIGINE</span>
Origine hawaïenne, terme emprunté par l’intermédiaire de l’anglais, lexicalisé en 2003
<span style="color:#9B85BE;">CITATIONS FRANÇAISES</span>
« Les wikis reposent sur une conception non individualiste de la connaissance. Il ne s’agit pas de revendiquer la propriété d’un contenu, mais de contribuer à une aventure collective. »
Jérôme Delacroix, ''Les Wikis''
{{Présentation}}
20dcbfd0038cd17b20d7834f6ca1799345bdc9f4
241
240
2015-04-09T19:42:45Z
Seb35
1
+concours Dis-moi dix mots
wikitext
text/x-wiki
<div class="plainlinks" style="width:70%; margin-left:5%;"><div style="border:1px dotted #9B85BE; padding: 0.5em 1em;">
<span style="color:#9B85BE;">'''WIKI'''</span>
<div style="float:left; color:#717171; background-color:#EEEEEE; line-height: 1.3em; margin-right:0.5em;">[[Fichier:Tamponsmots wiki.jpg|none]]©Polysémique</div>
<span style="color:#9B85BE;">DÉFINITION(S)</span><br />
Wiki [wiki] n. m. – ÉTYM. 2003, mot anglais américain, abréviation de WikiWikiWeb, nom du site créé par W. Cunningham en 1995, de l’hawaïen wiki wiki « vite »
Site web collaboratif dont le contenu peut être librement modifié par les visiteurs autorisés. Le développement des wikis. APPOS. Site, encyclopédie wiki.
<span style="color:#9B85BE;">ORIGINE</span><br />
Origine hawaïenne, terme emprunté par l’intermédiaire de l’anglais, lexicalisé en 2003
<span style="color:#9B85BE;">CITATIONS FRANÇAISES</span><br />
« Les wikis reposent sur une conception non individualiste de la connaissance. Il ne s’agit pas de revendiquer la propriété d’un contenu, mais de contribuer à une aventure collective. »
Jérôme Delacroix, ''Les Wikis''
</div>
Le mot « wiki » est un des mots à utiliser dans le concours de poésie ''[http://www.dismoidixmots.culture.fr/ressources/la-thematique-et-les-dix-mots Dis-moi dix mots]'', édition 2014–2015.
</div>
{{Présentation}}
a9a5dd7e63154c4db85cdcdf7980a522cf12069f
243
241
2015-04-09T19:44:54Z
Seb35
1
mise en page
wikitext
text/x-wiki
<div class="plainlinks" style="width:70%; margin-top:1em; margin-left:5%;"><div style="border:1px dotted #9B85BE; padding: 0.5em 1em;">
<span style="color:#9B85BE;">'''WIKI'''</span>
<div style="float:left; color:#717171; background-color:#EEEEEE; line-height: 1.3em; margin-right:0.5em;">[[Fichier:Tamponsmots wiki.jpg|none]]©Polysémique</div>
<span style="color:#9B85BE;">DÉFINITION(S)</span><br />
Wiki [wiki] n. m. – ÉTYM. 2003, mot anglais américain, abréviation de WikiWikiWeb, nom du site créé par W. Cunningham en 1995, de l’hawaïen wiki wiki « vite »
Site web collaboratif dont le contenu peut être librement modifié par les visiteurs autorisés. Le développement des wikis. APPOS. Site, encyclopédie wiki.
<span style="color:#9B85BE;">ORIGINE</span><br />
Origine hawaïenne, terme emprunté par l’intermédiaire de l’anglais, lexicalisé en 2003
<span style="color:#9B85BE;">CITATIONS FRANÇAISES</span><br />
« Les wikis reposent sur une conception non individualiste de la connaissance. Il ne s’agit pas de revendiquer la propriété d’un contenu, mais de contribuer à une aventure collective. »
Jérôme Delacroix, ''Les Wikis''
</div>
Le mot « wiki » est un des mots à utiliser dans le concours de poésie ''[http://www.dismoidixmots.culture.fr/ressources/la-thematique-et-les-dix-mots Dis-moi dix mots]'', édition 2014–2015.
</div>
{{Présentation}}
5ceb1dc03f1fd8df3c4acd9ca004cad241ac3d30
244
243
2015-04-09T19:47:36Z
Seb35
1
wikitext
text/x-wiki
<div class="plainlinks" style="width:70%; margin-top:2.5em; margin-left:5%;"><div style="border:1px dotted #9B85BE; padding: 0.5em 1em;">
<span style="color:#9B85BE;">'''WIKI'''</span>
<div style="float:left; color:#717171; background-color:#EEEEEE; line-height: 1.3em; margin-right:0.5em;">[[Fichier:Tamponsmots wiki.jpg|none]]©Polysémique</div>
<span style="color:#9B85BE;">DÉFINITION(S)</span><br />
Wiki [wiki] n. m. – ÉTYM. 2003, mot anglais américain, abréviation de WikiWikiWeb, nom du site créé par W. Cunningham en 1995, de l’hawaïen wiki wiki « vite »
Site web collaboratif dont le contenu peut être librement modifié par les visiteurs autorisés. Le développement des wikis. APPOS. Site, encyclopédie wiki.
<span style="color:#9B85BE;">ORIGINE</span><br />
Origine hawaïenne, terme emprunté par l’intermédiaire de l’anglais, lexicalisé en 2003
<span style="color:#9B85BE;">CITATIONS FRANÇAISES</span><br />
« Les wikis reposent sur une conception non individualiste de la connaissance. Il ne s’agit pas de revendiquer la propriété d’un contenu, mais de contribuer à une aventure collective. »
Jérôme Delacroix, ''Les Wikis''
</div>
Le mot « wiki » est un des mots à utiliser dans le concours de poésie ''[http://www.dismoidixmots.culture.fr/ressources/la-thematique-et-les-dix-mots Dis-moi dix mots]'', édition 2014–2015.
</div>
{{Présentation}}
872a5f25ffef31ed5d66822d6c10e9e4f1fbc151
245
244
2015-04-09T19:50:37Z
Seb35
1
+titre
wikitext
text/x-wiki
<div class="plainlinks" style="width:70%; margin-top:3.5em; margin-left:5%;"><div style="border:1px dotted #9B85BE; padding: 0.5em 1em;">
<span style="color:#9B85BE;">'''WIKI'''</span>
<div style="float:left; color:#717171; background-color:#EEEEEE; line-height: 1.3em; margin-right:0.5em;">[[Fichier:Tamponsmots wiki.jpg|none]]©Polysémique</div>
<span style="color:#9B85BE;">DÉFINITION(S)</span><br />
Wiki [wiki] n. m. – ÉTYM. 2003, mot anglais américain, abréviation de WikiWikiWeb, nom du site créé par W. Cunningham en 1995, de l’hawaïen wiki wiki « vite »
Site web collaboratif dont le contenu peut être librement modifié par les visiteurs autorisés. Le développement des wikis. APPOS. Site, encyclopédie wiki.
<span style="color:#9B85BE;">ORIGINE</span><br />
Origine hawaïenne, terme emprunté par l’intermédiaire de l’anglais, lexicalisé en 2003
<span style="color:#9B85BE;">CITATIONS FRANÇAISES</span><br />
« Les wikis reposent sur une conception non individualiste de la connaissance. Il ne s’agit pas de revendiquer la propriété d’un contenu, mais de contribuer à une aventure collective. »
Jérôme Delacroix, ''Les Wikis''
</div>
Le mot « wiki » est un des mots à utiliser dans le concours de poésie ''[http://www.dismoidixmots.culture.fr/ressources/la-thematique-et-les-dix-mots Dis-moi dix mots]'', édition 2014–2015.
</div>
{{DISPLAYTITLE:Définition d’un wiki}}
{{Présentation}}
d0cf87171f6bafadf9b1dd31a396bbaa9d010c9a
247
245
2015-04-09T21:05:10Z
Seb35
1
wikitext
text/x-wiki
<div class="plainlinks" style="width:70%; margin-top:4.5em; margin-left:5%;"><div style="border:1px dotted #9B85BE; padding: 0.5em 1em;">
<span style="color:#9B85BE;">'''WIKI'''</span>
<div style="float:left; color:#717171; background-color:#EEEEEE; line-height: 1.3em; margin-right:0.5em;">[[Fichier:Tamponsmots wiki.jpg|none]]©Polysémique</div>
<span style="color:#9B85BE;">DÉFINITION(S)</span><br />
Wiki [wiki] n. m. – ÉTYM. 2003, mot anglais américain, abréviation de WikiWikiWeb, nom du site créé par W. Cunningham en 1995, de l’hawaïen wiki wiki « vite »
Site web collaboratif dont le contenu peut être librement modifié par les visiteurs autorisés. Le développement des wikis. APPOS. Site, encyclopédie wiki.
<span style="color:#9B85BE;">ORIGINE</span><br />
Origine hawaïenne, terme emprunté par l’intermédiaire de l’anglais, lexicalisé en 2003
<span style="color:#9B85BE;">CITATIONS FRANÇAISES</span><br />
« Les wikis reposent sur une conception non individualiste de la connaissance. Il ne s’agit pas de revendiquer la propriété d’un contenu, mais de contribuer à une aventure collective. »
Jérôme Delacroix, ''Les Wikis''
</div>
Le mot « wiki » est un des mots à utiliser dans le concours de poésie et d’art ''[http://www.dismoidixmots.culture.fr/ressources/la-thematique-et-les-dix-mots Dis-moi dix mots]'', édition 2014–2015.
</div>
{{DISPLAYTITLE:Définition d’un wiki}}
{{Présentation}}
1b67709b4a680e164d92413d285b06393aee795b
248
247
2015-04-09T21:11:39Z
Seb35
1
syntaxe
wikitext
text/x-wiki
<div class="plainlinks" style="width:70%; margin-top:4.5em; margin-left:5%;"><div style="border:1px dotted #9B85BE; padding: 0.5em 1em;">
<span style="color:#9B85BE;">'''WIKI'''</span>
<div style="float:left; color:#717171; background-color:#EEEEEE; line-height: 1.3em; margin-right:0.5em;">[[Fichier:Tamponsmots wiki.jpg|none]]©Polysémique</div>
<span style="color:#9B85BE;">DÉFINITION(S)</span><br />
Wiki [wiki] n. m. – ÉTYM. 2003, mot anglais américain, abréviation de WikiWikiWeb, nom du site créé par W. Cunningham en 1995, de l’hawaïen wiki wiki « vite »
Site web collaboratif dont le contenu peut être librement modifié par les visiteurs autorisés. Le développement des wikis. APPOS. Site, encyclopédie wiki.
<span style="color:#9B85BE;">ORIGINE</span><br />
Origine hawaïenne, terme emprunté par l’intermédiaire de l’anglais, lexicalisé en 2003
<span style="color:#9B85BE;">CITATIONS FRANÇAISES</span><br />
« Les wikis reposent sur une conception non individualiste de la connaissance. Il ne s’agit pas de revendiquer la propriété d’un contenu, mais de contribuer à une aventure collective. »
Jérôme Delacroix, ''Les Wikis''
</div>
Le mot « wiki » est un des mots à utiliser dans le concours de poésie et d’art ''[http://www.dismoidixmots.culture.fr/ressources/la-thematique-et-les-dix-mots Dis-moi dix mots]'', édition 2014–2015.
</div>
{{Présentation|Définition d’un wiki}}
2a1bdc0f52203f7f2a84c76e8393ce3bbdc47ad4
MediaWiki:Common.css
8
4
228
214
2015-04-09T13:59:28Z
Seb35
1
gestion de la hauteur des diapos
css
text/css
/* Contenu en couleur noire et non grise */
div#content {
color: black;
}
/* Code en couleur grise */
pre, code, tt, kbd, samp, .mw-code {
color: #252525;
}
/* Espace de noms Présentation avec un style « diapositives » */
.ns-104.action-view {
background: white;
height: 97%;
}
.ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer {
display: none;
}
.ns-104.action-view #content {
width: 90%;
height: 92%;
margin: 2% auto;
padding: 1em;
border: 1px solid #A7D7F9;
}
a83c06d4f31659cdad394a8c66f17e02c89da538
229
228
2015-04-09T14:10:37Z
Seb35
1
hauteur diapo
css
text/css
/* Contenu en couleur noire et non grise */
div#content {
color: black;
}
/* Code en couleur grise */
pre, code, tt, kbd, samp, .mw-code {
color: #252525;
}
/* Espace de noms Présentation avec un style « diapositives » */
.ns-104.action-view {
background: white;
height: 96%;
}
.ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer {
display: none;
}
.ns-104.action-view #content {
width: 90%;
height: 95%;
margin: 1% auto;
padding: 1em;
border: 1px solid #A7D7F9;
}
5a672526883f30bba572f554f77084d513e5ab87
230
229
2015-04-09T14:11:29Z
Seb35
1
re
css
text/css
/* Contenu en couleur noire et non grise */
div#content {
color: black;
}
/* Code en couleur grise */
pre, code, tt, kbd, samp, .mw-code {
color: #252525;
}
/* Espace de noms Présentation avec un style « diapositives » */
.ns-104.action-view {
background: white;
height: 95%;
}
.ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer {
display: none;
}
.ns-104.action-view #content {
width: 90%;
height: 95%;
margin: 1% auto;
padding: 1em;
border: 1px solid #A7D7F9;
}
c08de50cb1f20a1dfc2d03064bcec9d7d5798c43
231
230
2015-04-09T14:12:50Z
Seb35
1
re
css
text/css
/* Contenu en couleur noire et non grise */
div#content {
color: black;
}
/* Code en couleur grise */
pre, code, tt, kbd, samp, .mw-code {
color: #252525;
}
/* Espace de noms Présentation avec un style « diapositives » */
.ns-104.action-view {
background: white;
height: 96%;
}
.ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer {
display: none;
}
.ns-104.action-view #content {
width: 90%;
height: 95%;
margin: 1% auto;
padding: 1em;
border: 1px solid #A7D7F9;
}
5a672526883f30bba572f554f77084d513e5ab87
233
231
2015-04-09T14:25:53Z
Seb35
1
position de la barre de présentation
css
text/css
/* Contenu en couleur noire et non grise */
div#content {
color: black;
}
/* Code en couleur grise */
pre, code, tt, kbd, samp, .mw-code {
color: #252525;
}
/* Espace de noms Présentation avec un style « diapositives » */
.ns-104.action-view {
background: white;
height: 96%;
}
.ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer {
display: none;
}
.ns-104.action-view #content {
width: 90%;
height: 95%;
margin: 1% auto;
padding: 1em;
border: 1px solid #A7D7F9;
}
.ns-104 .presentation-bar {
font-size: 85%;
}
.ns-104 #presentation-bar-left, .ns-104 #presentation-bar-right {
position: fixed;
bottom: 2%;
}
.ns-104 #presentation-bar-left {
left: 8%
}
.ns-104 #presentation-bar-right {
right: 8%;
}
14c25f4e0e84e906d195a154c36fee68572dbdf6
234
233
2015-04-09T14:32:40Z
Seb35
1
ajustement barre de navigation
css
text/css
/* Contenu en couleur noire et non grise */
div#content {
color: black;
}
/* Code en couleur grise */
pre, code, tt, kbd, samp, .mw-code {
color: #252525;
}
/* Espace de noms Présentation avec un style « diapositives » */
.ns-104.action-view {
background: white;
height: 96%;
}
.ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer, .ns-104 #contentSub {
display: none;
}
.ns-104.action-view #content {
width: 90%;
height: 95%;
margin: 1% auto;
padding: 1em;
border: 1px solid #A7D7F9;
}
.ns-104 .presentation-bar {
font-size: 80%;
}
.ns-104 #presentation-bar-left, .ns-104 #presentation-bar-right {
position: fixed;
bottom: 2%;
}
.ns-104 #presentation-bar-left {
left: 5%
}
.ns-104 #presentation-bar-right {
right: 5%;
}
b9acdef5d0b7fa176f81b7d495938979ff93d8b0
246
234
2015-04-09T19:56:40Z
Seb35
1
retrait de la ligne de titre dans les présentations
css
text/css
/* Contenu en couleur noire et non grise */
div#content {
color: black;
}
/* Code en couleur grise */
pre, code, tt, kbd, samp, .mw-code {
color: #252525;
}
/* Espace de noms Présentation avec un style « diapositives » */
.ns-104.action-view {
background: white;
height: 96%;
}
.ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer, .ns-104 #contentSub {
display: none;
}
.ns-104.action-view #content {
width: 90%;
height: 95%;
margin: 1% auto;
padding: 1em;
border: 1px solid #A7D7F9;
}
.ns-104 h1, .ns-104 h2, .ns-104 h3, .ns-104 h4, .ns-104 h5, .ns-104 h6 {
border-bottom: 0px;
}
.ns-104 .presentation-bar {
font-size: 80%;
}
.ns-104 #presentation-bar-left, .ns-104 #presentation-bar-right {
position: fixed;
bottom: 2%;
}
.ns-104 #presentation-bar-left {
left: 5%
}
.ns-104 #presentation-bar-right {
right: 5%;
}
50ae93b7743c53345ebf4f22731d1bf6dfda2949
Fichier:Tamponsmots wiki.jpg
6
102
239
2015-04-09T15:00:52Z
Seb35
1
©Polysémique
Extrait de http://www.dismoidixmots.culture.fr/ressources/la-thematique-et-les-dix-mots pour illustration du mot choisi "wiki".
wikitext
text/x-wiki
©Polysémique
Extrait de http://www.dismoidixmots.culture.fr/ressources/la-thematique-et-les-dix-mots pour illustration du mot choisi "wiki".
e05480d9c747fe460e88c3347c893ccb20d5716a
Module:Présentation
0
103
250
2015-04-10T09:54:17Z
Seb35
1
création du code de base, je commenterai bientôt :-)
wikitext
text/x-wiki
--[[
]]
local presentation = {}
function presentation.total( frame )
return table.getn( presentation._expandSequence( mw.title.getCurrentTitle() ) )
end
function presentation.current( frame )
for i,v in pairs( presentation._expandSequence( mw.title.getCurrentTitle() ) ) do
if v == mw.title.getCurrentTitle().fullText then
return i
en
end
end
function presentation.next( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i+1]
en
end
end
function presentation.previous( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i-1]
en
end
end
function presentation._expandSequence( title )
local list = {};
local title = title.rootPageTitle;
while true do
if title.basePageTitle.subPageTitle( title.subpageText+1 ).exists then
title = title.basePageTitle.subPageTitle( title.subpageText+1 )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle.subPageTitle( title.subpageText+1 ).exists then
title = title.basePageTitle.basePageTitle.subPageTitle( title.subpageText+1 )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle.subPageTitle( title.subpageText+1 .. '/0' ).exists then
title = title.basePageTitle.basePageTitle.subPageTitle( title.subpageText+1 .. '/0' )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle.subPageTitle( title.subpageText+1 .. '/1' ).exists then
title = title.basePageTitle.basePageTitle.subPageTitle( title.subpageText+1 .. '/1' )
list[table.getn(list)] = title.fullText
else
break
end
end
return list
end
f6446565dfde78fb896e5091e43da4cbc0e96ccb
Module:Présentation
828
104
251
2015-04-10T10:55:10Z
81.53.206.206
0
création du code de base, je commenterai bientôt :-)
wikitext
text/x-wiki
--[[
]]
local presentation = {}
function presentation.total( frame )
return table.getn( presentation._expandSequence( mw.title.getCurrentTitle() ) )
end
function presentation.current( frame )
for i,v in pairs( presentation._expandSequence( mw.title.getCurrentTitle() ) ) do
if v == mw.title.getCurrentTitle().fullText then
return i
end
end
end
function presentation.next( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i+1]
end
end
end
function presentation.previous( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i-1]
end
end
end
function presentation._expandSequence( title )
local list = {};
local title = title.rootPageTitle;
while true do
if title.basePageTitle.subPageTitle( title.subpageText+1 ).exists then
title = title.basePageTitle.subPageTitle( title.subpageText+1 )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle.subPageTitle( title.subpageText+1 ).exists then
title = title.basePageTitle.basePageTitle.subPageTitle( title.subpageText+1 )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle.subPageTitle( title.subpageText+1 .. '/0' ).exists then
title = title.basePageTitle.basePageTitle.subPageTitle( title.subpageText+1 .. '/0' )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle.subPageTitle( title.subpageText+1 .. '/1' ).exists then
title = title.basePageTitle.basePageTitle.subPageTitle( title.subpageText+1 .. '/1' )
list[table.getn(list)] = title.fullText
else
break
end
end
return list
end
6a3880452c3ae65543575cc464f468c1eeab8a47
252
251
2015-04-10T14:59:47Z
Seb35
1
return
wikitext
text/x-wiki
--[[
]]
local presentation = {}
function presentation.total( frame )
return table.getn( presentation._expandSequence( mw.title.getCurrentTitle() ) )
end
function presentation.current( frame )
for i,v in pairs( presentation._expandSequence( mw.title.getCurrentTitle() ) ) do
if v == mw.title.getCurrentTitle().fullText then
return i
end
end
end
function presentation.next( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i+1]
end
end
end
function presentation.previous( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i-1]
end
end
end
function presentation._expandSequence( title )
local list = {};
local title = title.rootPageTitle;
while true do
if title.basePageTitle.subPageTitle( title.subpageText+1 ).exists then
title = title.basePageTitle.subPageTitle( title.subpageText+1 )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle.subPageTitle( title.subpageText+1 ).exists then
title = title.basePageTitle.basePageTitle.subPageTitle( title.subpageText+1 )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle.subPageTitle( title.subpageText+1 .. '/0' ).exists then
title = title.basePageTitle.basePageTitle.subPageTitle( title.subpageText+1 .. '/0' )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle.subPageTitle( title.subpageText+1 .. '/1' ).exists then
title = title.basePageTitle.basePageTitle.subPageTitle( title.subpageText+1 .. '/1' )
list[table.getn(list)] = title.fullText
else
break
end
end
return list
end
return presentation
dd18731bf13203392e0ed7a742d2b40ab2cdfdd4
253
252
2015-04-10T15:02:22Z
Seb35
1
fix bug
wikitext
text/x-wiki
--[[
]]
local presentation = {}
function presentation.total( frame )
return table.getn( presentation._expandSequence( mw.title.getCurrentTitle() ) )
end
function presentation.current( frame )
for i,v in pairs( presentation._expandSequence( mw.title.getCurrentTitle() ) ) do
if v == mw.title.getCurrentTitle().fullText then
return i
end
end
end
function presentation.next( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i+1]
end
end
end
function presentation.previous( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i-1]
end
end
end
function presentation._expandSequence( title )
local list = {};
local title = title.rootPageTitle;
while true do
if title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then
title = title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then
title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' ).exists then
title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' ).exists then
title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' )
list[table.getn(list)] = title.fullText
else
break
end
end
return list
end
return presentation
0d8d0670c6f114f0890ab0fe1d1237d7cc19a8ba
254
253
2015-04-10T15:07:55Z
Seb35
1
test
wikitext
text/x-wiki
--[[
]]
local presentation = {}
function presentation.total( frame )
return table.getn( presentation._expandSequence( mw.title.getCurrentTitle() ) )
end
function presention.test( frame )
return mw.title.getCurrentTitle().fullText
end
function presention.test2( frame )
return mw.title.getCurrentTitle().rootText
end
function presention.test3( frame )
return mw.title.getCurrentTitle().subpageText
end
function presentation.current( frame )
for i,v in pairs( presentation._expandSequence( mw.title.getCurrentTitle() ) ) do
if v == mw.title.getCurrentTitle().fullText then
return i
end
end
end
function presentation.next( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i+1]
end
end
end
function presentation.previous( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i-1]
end
end
end
function presentation._expandSequence( title )
local list = {};
local title = title.rootPageTitle;
while true do
if title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then
title = title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then
title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' ).exists then
title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' ).exists then
title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' )
list[table.getn(list)] = title.fullText
else
break
end
end
return list
end
return presentation
0ee0cc66ee3440dc2f37ebcd887efbb89fac45b0
255
254
2015-04-10T15:09:52Z
Seb35
1
wikitext
text/x-wiki
--[[
]]
local presentation = {}
function presentation.total( frame )
return table.getn( presentation._expandSequence( mw.title.getCurrentTitle() ) )
end
--[[function presention.test( frame )
return mw.title.getCurrentTitle().fullText
end
function presention.test2( frame )
return mw.title.getCurrentTitle().rootText
end
function presention.test3( frame )
return mw.title.getCurrentTitle().subpageText
end]]
function presentation.current( frame )
for i,v in pairs( presentation._expandSequence( mw.title.getCurrentTitle() ) ) do
if v == mw.title.getCurrentTitle().fullText then
return i
end
end
end
function presentation.next( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i+1]
end
end
end
function presentation.previous( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i-1]
end
end
end
function presentation._expandSequence( title )
local list = {};
local title = title.rootPageTitle;
while true do
if title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then
title = title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then
title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' ).exists then
title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' ).exists then
title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' )
list[table.getn(list)] = title.fullText
else
break
end
end
return list
end
return presentation
72443b6e1241c033823248715e4c40e847cc80c1
256
255
2015-04-10T15:11:45Z
Seb35
1
wikitext
text/x-wiki
--[[
]]
local presentation = {}
function presentation.total( frame )
return table.getn( presentation._expandSequence( mw.title.getCurrentTitle() ) )
end
function presention.test( frame )
return mw.title.getCurrentTitle()
end
--[[function presention.test2( frame )
return mw.title.getCurrentTitle().rootText
end
function presention.test3( frame )
return mw.title.getCurrentTitle().subpageText
end]]
function presentation.current( frame )
for i,v in pairs( presentation._expandSequence( mw.title.getCurrentTitle() ) ) do
if v == mw.title.getCurrentTitle().fullText then
return i
end
end
end
function presentation.next( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i+1]
end
end
end
function presentation.previous( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i-1]
end
end
end
function presentation._expandSequence( title )
local list = {};
local title = title.rootPageTitle;
while true do
if title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then
title = title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then
title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' ).exists then
title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' ).exists then
title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' )
list[table.getn(list)] = title.fullText
else
break
end
end
return list
end
return presentation
2587d78f803a3ccf5f6f4be398430b9e41adaa99
257
256
2015-04-10T15:13:34Z
Seb35
1
wikitext
text/x-wiki
--[[
]]
local presentation = {}
--[[function presentation.total( frame )
return table.getn( presentation._expandSequence( mw.title.getCurrentTitle() ) )
end]]
function presention.test( frame )
return mw.title.getCurrentTitle()
end
--[[function presention.test2( frame )
return mw.title.getCurrentTitle().rootText
end
function presention.test3( frame )
return mw.title.getCurrentTitle().subpageText
end]]
function presentation.current( frame )
for i,v in pairs( presentation._expandSequence( mw.title.getCurrentTitle() ) ) do
if v == mw.title.getCurrentTitle().fullText then
return i
end
end
end
function presentation.next( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i+1]
end
end
end
function presentation.previous( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i-1]
end
end
end
function presentation._expandSequence( title )
local list = {};
local title = title.rootPageTitle;
while true do
if title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then
title = title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then
title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' ).exists then
title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' ).exists then
title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' )
list[table.getn(list)] = title.fullText
else
break
end
end
return list
end
return presentation
2e8035451fe3f6a5741eec14e0cf51cde83d9df5
258
257
2015-04-10T15:15:31Z
Seb35
1
wikitext
text/x-wiki
--[[
]]
local presentation = {}
--[[function presentation.total( frame )
return table.getn( presentation._expandSequence( mw.title.getCurrentTitle() ) )
end]]
function presention.test( frame )
return mw.title.getCurrentTitle()
end
--[[function presention.test2( frame )
return mw.title.getCurrentTitle().rootText
end
function presention.test3( frame )
return mw.title.getCurrentTitle().subpageText
end
function presentation.current( frame )
for i,v in pairs( presentation._expandSequence( mw.title.getCurrentTitle() ) ) do
if v == mw.title.getCurrentTitle().fullText then
return i
end
end
end
function presentation.next( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i+1]
end
end
end
function presentation.previous( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i-1]
end
end
end
function presentation._expandSequence( title )
local list = {};
local title = title.rootPageTitle;
while true do
if title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then
title = title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then
title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' ).exists then
title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' ).exists then
title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' )
list[table.getn(list)] = title.fullText
else
break
end
end
return list
end]]
return presentation
dea07c73086f9e841fdaed48893e0fd5a94549ec
259
258
2015-04-10T15:16:45Z
Seb35
1
wikitext
text/x-wiki
--[[
]]
local presentation = {}
--[[function presentation.total( frame )
return table.getn( presentation._expandSequence( mw.title.getCurrentTitle() ) )
end]]
function presentation.test( frame )
return mw.title.getCurrentTitle()
end
function presentation.test2( frame )
return mw.title.getCurrentTitle().rootText
end
function presentation.test3( frame )
return mw.title.getCurrentTitle().subpageText
end
--[[function presentation.current( frame )
for i,v in pairs( presentation._expandSequence( mw.title.getCurrentTitle() ) ) do
if v == mw.title.getCurrentTitle().fullText then
return i
end
end
end
function presentation.next( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i+1]
end
end
end
function presentation.previous( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i-1]
end
end
end
function presentation._expandSequence( title )
local list = {};
local title = title.rootPageTitle;
while true do
if title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then
title = title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then
title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' ).exists then
title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' ).exists then
title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' )
list[table.getn(list)] = title.fullText
else
break
end
end
return list
end]]
return presentation
bf2989d1e15cd728bbc93073a6ad92dc99a453ce
260
259
2015-04-10T15:19:02Z
Seb35
1
test
wikitext
text/x-wiki
--[[
]]
local presentation = {}
function presentation.total( frame )
return table.getn( presentation._expandSequence( mw.title.getCurrentTitle() ) )
end
function presentation.test( frame )
return tonumber(mw.title.getCurrentTitle().subpageText)
end
function presentation.test2( frame )
return tonumber(mw.title.getCurrentTitle().subpageText)+1
end
function presentation.test3( frame )
return title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 )
end
function presentation.test4( frame )
return title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists
end
function presentation.current( frame )
for i,v in pairs( presentation._expandSequence( mw.title.getCurrentTitle() ) ) do
if v == mw.title.getCurrentTitle().fullText then
return i
end
end
end
function presentation.next( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i+1]
end
end
end
function presentation.previous( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i-1]
end
end
end
function presentation._expandSequence( title )
local list = {};
local title = title.rootPageTitle;
while true do
if title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then
title = title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then
title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' ).exists then
title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' ).exists then
title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' )
list[table.getn(list)] = title.fullText
else
break
end
end
return list
end
return presentation
d1564c237aed501a5aaa39b11e4e5a28fce975c2
261
260
2015-04-10T15:20:22Z
Seb35
1
wikitext
text/x-wiki
--[[
]]
local presentation = {}
function presentation.total( frame )
return table.getn( presentation._expandSequence( mw.title.getCurrentTitle() ) )
end
function presentation.test( frame )
return tonumber(mw.title.getCurrentTitle().subpageText)
end
function presentation.test2( frame )
return tonumber(mw.title.getCurrentTitle().subpageText)+1
end
function presentation.test3( frame )
return mw.title.getCurrentTitle().basePageTitle.subPageTitle( tonumber(mw.title.getCurrentTitle().subpageText)+1 )
end
function presentation.test4( frame )
return mw.title.getCurrentTitle().basePageTitle.subPageTitle( tonumber(mw.title.getCurrentTitle().subpageText)+1 ).exists
end
function presentation.current( frame )
for i,v in pairs( presentation._expandSequence( mw.title.getCurrentTitle() ) ) do
if v == mw.title.getCurrentTitle().fullText then
return i
end
end
end
function presentation.next( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i+1]
end
end
end
function presentation.previous( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i-1]
end
end
end
function presentation._expandSequence( title )
local list = {};
local title = title.rootPageTitle;
while true do
if title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then
title = title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then
title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' ).exists then
title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' ).exists then
title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' )
list[table.getn(list)] = title.fullText
else
break
end
end
return list
end
return presentation
90a4539f5eebca2cf779e32b2b2243c9c1414ac7
262
261
2015-04-10T15:22:45Z
Seb35
1
wikitext
text/x-wiki
--[[
]]
local presentation = {}
function presentation.total( frame )
return table.getn( presentation._expandSequence( mw.title.getCurrentTitle() ) )
end
function presentation.test( frame )
return tonumber(mw.title.getCurrentTitle().subpageText)
end
function presentation.test2( frame )
return tonumber(mw.title.getCurrentTitle().subpageText)+1
end
function presentation.test3( frame )
return mw.title.getCurrentTitle().basePageTitle:subPageTitle( tonumber(mw.title.getCurrentTitle().subpageText)+1 )
end
function presentation.current( frame )
for i,v in pairs( presentation._expandSequence( mw.title.getCurrentTitle() ) ) do
if v == mw.title.getCurrentTitle().fullText then
return i
end
end
end
function presentation.next( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i+1]
end
end
end
function presentation.previous( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i-1]
end
end
end
function presentation._expandSequence( title )
local list = {};
local title = title.rootPageTitle;
while true do
if title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then
title = title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then
title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' ).exists then
title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' ).exists then
title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' )
list[table.getn(list)] = title.fullText
else
break
end
end
return list
end
return presentation
96d5111aa52087263a15dd38206f9eb5e71d9c04
263
262
2015-04-10T15:24:34Z
Seb35
1
wikitext
text/x-wiki
--[[
]]
local presentation = {}
function presentation.total( frame )
return table.getn( presentation._expandSequence( mw.title.getCurrentTitle() ) )
end
function presentation.test( frame )
return tonumber(mw.title.getCurrentTitle().subpageText)
end
function presentation.test2( frame )
return tonumber(mw.title.getCurrentTitle().subpageText)+1
end
function presentation.test3( frame )
return mw.title.getCurrentTitle().basePageTitle:subPageTitle( tostring(tonumber(mw.title.getCurrentTitle().subpageText)+1) )
end
function presentation.test4( frame )
return mw.title.getCurrentTitle().basePageTitle:subPageTitle( tostring(tonumber(mw.title.getCurrentTitle().subpageText)+1) ).exists
end
function presentation.current( frame )
for i,v in pairs( presentation._expandSequence( mw.title.getCurrentTitle() ) ) do
if v == mw.title.getCurrentTitle().fullText then
return i
end
end
end
function presentation.next( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i+1]
end
end
end
function presentation.previous( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i-1]
end
end
end
function presentation._expandSequence( title )
local list = {};
local title = title.rootPageTitle;
while true do
if title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then
title = title.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 ).exists then
title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' ).exists then
title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/0' )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' ).exists then
title = title.basePageTitle.basePageTitle.subPageTitle( tonumber(title.subpageText)+1 .. '/1' )
list[table.getn(list)] = title.fullText
else
break
end
end
return list
end
return presentation
4ec9f4a735079490814c43759497003607591c3b
264
263
2015-04-10T15:26:02Z
Seb35
1
wikitext
text/x-wiki
--[[
]]
local presentation = {}
function presentation.total( frame )
return table.getn( presentation._expandSequence( mw.title.getCurrentTitle() ) )
end
function presentation.test( frame )
return tonumber(mw.title.getCurrentTitle().subpageText)
end
function presentation.test2( frame )
return tonumber(mw.title.getCurrentTitle().subpageText)+1
end
function presentation.test3( frame )
return mw.title.getCurrentTitle().basePageTitle:subPageTitle( tostring(tonumber(mw.title.getCurrentTitle().subpageText)+1) )
end
function presentation.test4( frame )
return mw.title.getCurrentTitle().basePageTitle:subPageTitle( tostring(tonumber(mw.title.getCurrentTitle().subpageText)+1) ).exists
end
function presentation.current( frame )
for i,v in pairs( presentation._expandSequence( mw.title.getCurrentTitle() ) ) do
if v == mw.title.getCurrentTitle().fullText then
return i
end
end
end
function presentation.next( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i+1]
end
end
end
function presentation.previous( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i-1]
end
end
end
function presentation._expandSequence( title )
local list = {};
local title = title.rootPageTitle;
while true do
if title.basePageTitle:subPageTitle( tonumber(title.subpageText)+1 ).exists then
title = title.basePageTitle:subPageTitle( tonumber(title.subpageText)+1 )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle:subPageTitle( tonumber(title.subpageText)+1 ).exists then
title = title.basePageTitle.basePageTitle:subPageTitle( tonumber(title.subpageText)+1 )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle:subPageTitle( tonumber(title.subpageText)+1 .. '/0' ).exists then
title = title.basePageTitle.basePageTitle:subPageTitle( tonumber(title.subpageText)+1 .. '/0' )
list[table.getn(list)] = title.fullText
elseif title.basePageTitle.basePagTitle:subPageTitle( tonumber(title.subpageText)+1 .. '/1' ).exists then
title = title.basePageTitle.basePageTitle:subPageTitle( tonumber(title.subpageText)+1 .. '/1' )
list[table.getn(list)] = title.fullText
else
break
end
end
return list
end
return presentation
958bf4f29d8251976968c523516b1e846fcda859
Module:Présentation
828
104
265
264
2015-04-10T16:40:14Z
Seb35
1
debug et testé en ligne de commande, ça devrait fonctionner
wikitext
text/x-wiki
--[[
]]
local presentation = {}
function presentation.total( frame )
return table.getn( presentation._expandSequence( mw.title.getCurrentTitle() ) )
end
function presentation.test( frame )
return tonumber(mw.title.getCurrentTitle().subpageText)
end
function presentation.test2( frame )
return tonumber(mw.title.getCurrentTitle().subpageText)+1
end
function presentation.test3( frame )
return mw.title.getCurrentTitle().basePageTitle:subPageTitle( tostring(tonumber(mw.title.getCurrentTitle().subpageText)+1) )
end
function presentation.test4( frame )
return mw.title.getCurrentTitle().basePageTitle:subPageTitle( tostring(tonumber(mw.title.getCurrentTitle().subpageText)+1) ).exists
end
function presentation.current( frame )
for i,v in pairs( presentation._expandSequence( mw.title.getCurrentTitle() ) ) do
if v == mw.title.getCurrentTitle().fullText then
return i
end
end
end
function presentation.next( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i+1]
end
end
end
function presentation.previous( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i-1]
end
end
end
function presentation._expandSequence( title )
local list = {};
title = title.rootPageTitle;
while true do
if title:subPageTitle( '0' ).exists then
title = title:subPageTitle( '0' )
list[table.getn(list)+1] = title.fullText
elseif title:subPageTitle( '1' ).exists then
title = title:subPageTitle( '1' )
list[table.getn(list)+1] = title.fullText
elseif title.basePageTitle:subPageTitle( tonumber(title.subpageText)+1 ).exists then
title = title.basePageTitle:subPageTitle( tonumber(title.subpageText)+1 )
list[table.getn(list)+1] = title.fullText
elseif title.baseText ~= title.rootText then
title = title.basePageTitle
else
break
end
end
return list
end
return presentation
3c118fc309e945ec3193ebdba6949bce086e4749
266
265
2015-04-10T16:42:32Z
Seb35
1
wikitext
text/x-wiki
--[[
]]
local presentation = {}
function presentation.total( frame )
return table.getn( presentation._expandSequence( mw.title.getCurrentTitle() ) )
end
function presentation.test( frame )
return tonumber(mw.title.getCurrentTitle().subpageText)
end
function presentation.test2( frame )
return tonumber(mw.title.getCurrentTitle().subpageText)+1
end
function presentation.test3( frame )
return mw.title.getCurrentTitle().basePageTitle:subPageTitle( tostring(tonumber(mw.title.getCurrentTitle().subpageText)+1) )
end
function presentation.test4( frame )
return mw.title.getCurrentTitle().basePageTitle:subPageTitle( tostring(tonumber(mw.title.getCurrentTitle().subpageText)+1) ).exists
end
function presentation.current( frame )
for i,v in pairs( presentation._expandSequence( mw.title.getCurrentTitle() ) ) do
if v == mw.title.getCurrentTitle().fullText then
return i
end
end
end
function presentation.next( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i+1]
end
end
end
function presentation.previous( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i-1]
end
end
end
function presentation._expandSequence( title )
local list = {};
title = title.rootPageTitle;
while true do
if title:subPageTitle( '0' ).exists then
title = title:subPageTitle( '0' )
list[table.getn(list)+1] = title.fullText
elseif title:subPageTitle( '1' ).exists then
title = title:subPageTitle( '1' )
list[table.getn(list)+1] = title.fullText
elseif title.basePageTitle:subPageTitle( tostring(tonumber(title.subpageText)+1) ).exists then
title = title.basePageTitle:subPageTitle( tostring(tonumber(title.subpageText)+1) )
list[table.getn(list)+1] = title.fullText
elseif title.baseText ~= title.rootText then
title = title.basePageTitle
else
break
end
end
return list
end
return presentation
5d180801295b3d12695e502ddef728125be5038f
268
266
2015-04-10T16:56:32Z
Seb35
1
retrait des tests
wikitext
text/x-wiki
--[[
]]
local presentation = {}
function presentation.total( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
return table.getn( sequence )
end
function presentation.current( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return i
end
end
end
function presentation.next( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i+1]
end
end
end
function presentation.previous( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i-1]
end
end
end
function presentation._expandSequence( title )
local list = {};
title = title.rootPageTitle;
while true do
if title:subPageTitle( '0' ).exists then
title = title:subPageTitle( '0' )
list[table.getn(list)+1] = title.fullText
elseif title:subPageTitle( '1' ).exists then
title = title:subPageTitle( '1' )
list[table.getn(list)+1] = title.fullText
elseif title.basePageTitle:subPageTitle( tostring(tonumber(title.subpageText)+1) ).exists then
title = title.basePageTitle:subPageTitle( tostring(tonumber(title.subpageText)+1) )
list[table.getn(list)+1] = title.fullText
elseif title.baseText ~= title.rootText then
title = title.basePageTitle
else
break
end
end
return list
end
return presentation
10dea3a3fc90cc8aa24841f9a768bd52b9ff95a3
269
268
2015-04-10T16:59:46Z
Seb35
1
vérification supplémentaire
wikitext
text/x-wiki
--[[
]]
local presentation = {}
function presentation.total( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
return table.getn( sequence )
end
function presentation.current( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return i
end
end
end
function presentation.next( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i+1]
end
end
end
function presentation.previous( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i-1]
end
end
end
function presentation._expandSequence( title )
local list = {};
title = title.rootPageTitle;
while true do
if title:subPageTitle( '0' ).exists then
title = title:subPageTitle( '0' )
list[table.getn(list)+1] = title.fullText
elseif title:subPageTitle( '1' ).exists then
title = title:subPageTitle( '1' )
list[table.getn(list)+1] = title.fullText
elseif tonumber(title.subpageText) ~= nil and title.basePageTitle:subPageTitle( tostring(tonumber(title.subpageText)+1) ).exists then
title = title.basePageTitle:subPageTitle( tostring(tonumber(title.subpageText)+1) )
list[table.getn(list)+1] = title.fullText
elseif title.baseText ~= title.rootText then
title = title.basePageTitle
else
break
end
end
return list
end
return presentation
c457c5db21de35af57c8ad937693d1d7cc634594
270
269
2015-04-10T17:02:48Z
Seb35
1
valeurs de retour par défaut
wikitext
text/x-wiki
--[[
]]
local presentation = {}
function presentation.total( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
return table.getn( sequence )
end
function presentation.current( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return i
end
end
return 0
end
function presentation.next( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i+1]
end
end
return ''
end
function presentation.previous( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i-1]
end
end
return ''
end
function presentation._expandSequence( title )
local list = {};
title = title.rootPageTitle;
while true do
if title:subPageTitle( '0' ).exists then
title = title:subPageTitle( '0' )
list[table.getn(list)+1] = title.fullText
elseif title:subPageTitle( '1' ).exists then
title = title:subPageTitle( '1' )
list[table.getn(list)+1] = title.fullText
elseif tonumber(title.subpageText) ~= nil and title.basePageTitle:subPageTitle( tostring(tonumber(title.subpageText)+1) ).exists then
title = title.basePageTitle:subPageTitle( tostring(tonumber(title.subpageText)+1) )
list[table.getn(list)+1] = title.fullText
elseif title.baseText ~= title.rootText then
title = title.basePageTitle
else
break
end
end
return list
end
return presentation
3c86a9ba8ebd6633ae35891353c5fcaa63e21e6d
273
270
2015-04-10T17:43:47Z
Seb35
1
bug résolu (normalement) : récursion infinie lorsque des pages hiérarchiques sont utilisées
wikitext
text/x-wiki
--[[
]]
local presentation = {}
function presentation.total( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
return table.getn( sequence )
end
function presentation.current( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return i
end
end
return 0
end
function presentation.next( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i+1]
end
end
return ''
end
function presentation.previous( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i-1]
end
end
return ''
end
function presentation._expandSequence( title )
local list = {};
title = title.rootPageTitle;
while true do
if title:subPageTitle( '0' ).exists then
title = title:subPageTitle( '0' )
list[table.getn(list)+1] = title.fullText
elseif title:subPageTitle( '1' ).exists then
title = title:subPageTitle( '1' )
list[table.getn(list)+1] = title.fullText
elseif tonumber(title.subpageText) ~= nil and title.basePageTitle:subPageTitle( tostring(tonumber(title.subpageText)+1) ).exists then
title = title.basePageTitle:subPageTitle( tostring(tonumber(title.subpageText)+1) )
list[table.getn(list)+1] = title.fullText
elseif title.baseText ~= title.rootText then
title = title.basePageTitle.basePageTitle:subpageTitle( tostring(tonumber(title.basePageTitle.subpageText)+1) )
if title.exists then
list[table.getn(list)+1] = title.fullText
end
else
break
end
end
return list
end
return presentation
56fbdf61db6c8a7c968a87e3f1daae21bec9e9b3
274
273
2015-04-10T17:45:45Z
Seb35
1
typo
wikitext
text/x-wiki
--[[
]]
local presentation = {}
function presentation.total( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
return table.getn( sequence )
end
function presentation.current( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return i
end
end
return 0
end
function presentation.next( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i+1]
end
end
return ''
end
function presentation.previous( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i-1]
end
end
return ''
end
function presentation._expandSequence( title )
local list = {};
title = title.rootPageTitle;
while true do
if title:subPageTitle( '0' ).exists then
title = title:subPageTitle( '0' )
list[table.getn(list)+1] = title.fullText
elseif title:subPageTitle( '1' ).exists then
title = title:subPageTitle( '1' )
list[table.getn(list)+1] = title.fullText
elseif tonumber(title.subpageText) ~= nil and title.basePageTitle:subPageTitle( tostring(tonumber(title.subpageText)+1) ).exists then
title = title.basePageTitle:subPageTitle( tostring(tonumber(title.subpageText)+1) )
list[table.getn(list)+1] = title.fullText
elseif title.baseText ~= title.rootText then
title = title.basePageTitle.basePageTitle:subPageTitle( tostring(tonumber(title.basePageTitle.subpageText)+1) )
if title.exists then
list[table.getn(list)+1] = title.fullText
end
else
break
end
end
return list
end
return presentation
e542933bb916c7be2bddbeba357d130a70b50b54
280
274
2015-04-12T20:43:23Z
Seb35
1
ajout de la possibilité du scénario /1/2, /1/3/1, …
wikitext
text/x-wiki
--[[
]]
local presentation = {}
function presentation.total( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
return table.getn( sequence )
end
function presentation.current( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return i
end
end
return 0
end
function presentation.next( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i+1]
end
end
return ''
end
function presentation.previous( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i-1]
end
end
return ''
end
function presentation._expandSequence( title )
local list = {};
title = title.rootPageTitle;
while true do
if title:subPageTitle( '0' ).exists then
title = title:subPageTitle( '0' )
list[table.getn(list)+1] = title.fullText
elseif title:subPageTitle( '1' ).exists then
title = title:subPageTitle( '1' )
list[table.getn(list)+1] = title.fullText
elseif tonumber(title.subpageText) ~= nil then
if not title.exists then
if title.baseText == title.rootText then
break
end
title = title.basePageTitle.basePageTitle:subPageTitle( tostring(tonumber(title.basePageTitle.subpageText)+1) )
else
title = title.basePageTitle:subPageTitle( tostring(tonumber(title.subpageText)+1) )
if title.exists then
list[table.getn(list)+1] = title.fullText
end
end
else
break
end
end
return list
end
return presentation
e8e923f3c3825ceae720d1941beee52363834a23
Modèle:Présentation
10
100
267
249
2015-04-10T16:50:58Z
Seb35
1
utilisation de Lua pour gérer les diapos précédentes et suivantes, pour pouvoir utiliser un ordre hiérarchique des diapos : /1, /1/1, /1/2, /2, /2/0, /2/1, /2/2, /2/3
wikitext
text/x-wiki
<div id="presentation-bar-left" class="presentation-bar plainlinks">
<p>[[{{NAMESPACE}}:{{BASEPAGENAME}}|<span style="color:#0645AD;">{{BASEPAGENAME}}</span>]] – [{{fullurl:{{FULLPAGENAME}}|action=edit}} <span style="color:#0645AD;">{{lc:{{int:edit}}}}]</span></p>
</div>
<div id="presentation-bar-right" class="presentation-bar">
<p>
<span style="{{#if:{{#invoke:Présentation|previous}}||visibility:hidden;}}">[[Fichier:Arrow Blue Left 001.svg|15px|link={{#invoke:Présentation|previous}}]]</span>
<span style="{{#if:{{#invoke:Présentation|next}}||visibility:hidden;}}">[[Fichier:Arrow Blue Right 001.svg|15px|link={{#invoke:Présentation|next}}]]</span>
{{#invoke:Présentation|current}}/{{#invoke:Présentation|total}}
</p>
</div>
{{#if:{{{1|}}}|{{DISPLAYTITLE:{{{1}}}}}}}
b0a6da79bfe22ff36bc4bc96e61f4936560635f6
275
267
2015-04-10T17:47:27Z
Seb35
1
fix nom de la présentation lorsqu’il y a plus d’un niveau
wikitext
text/x-wiki
<div id="presentation-bar-left" class="presentation-bar plainlinks">
<p>[[{{NAMESPACE}}:{{ROOTPAGENAME}}|<span style="color:#0645AD;">{{ROOTPAGENAME}}</span>]] – [{{fullurl:{{FULLPAGENAME}}|action=edit}} <span style="color:#0645AD;">{{lc:{{int:edit}}}}]</span></p>
</div>
<div id="presentation-bar-right" class="presentation-bar">
<p>
<span style="{{#if:{{#invoke:Présentation|previous}}||visibility:hidden;}}">[[Fichier:Arrow Blue Left 001.svg|15px|link={{#invoke:Présentation|previous}}]]</span>
<span style="{{#if:{{#invoke:Présentation|next}}||visibility:hidden;}}">[[Fichier:Arrow Blue Right 001.svg|15px|link={{#invoke:Présentation|next}}]]</span>
{{#invoke:Présentation|current}}/{{#invoke:Présentation|total}}
</p>
</div>
{{#if:{{{1|}}}|{{DISPLAYTITLE:{{{1}}}}}}}
3d43588a7eb91c9dea49024de08c67157c86a3e0
287
275
2015-04-12T21:13:12Z
Seb35
1
+2 liens, +classes
wikitext
text/x-wiki
<div id="presentation-bar-left" class="presentation-bar plainlinks">
<p>[[{{NAMESPACE}}:{{ROOTPAGENAME}}|<span style="color:#0645AD;">{{ROOTPAGENAME}}</span>]]<!--
--><span class="presentation-edit"> – [{{fullurl:{{FULLPAGENAME}}|action=edit}} <span style="color:#0645AD;">{{lc:{{int:edit}}}}</span>]</span><!--
--><span class="presentation-purge"> – [{{fullurl:{{FULLPAGENAME}}|action=purge}} <span style="color:#0645AD;">{{lc:{{int:purge}}}}</span>]</span><!--
--><span class="presentation-move"> – [[{{#special:Movepage}}/{{FULLPAGENAME}}|<span style="color:#0645AD;">{{lc:{{int:move}}}}</span>]</span></p>
</div>
<div id="presentation-bar-right" class="presentation-bar">
<p>
<span style="{{#if:{{#invoke:Présentation|previous}}||visibility:hidden;}}">[[Fichier:Arrow Blue Left 001.svg|15px|link={{#invoke:Présentation|previous}}]]</span>
<span style="{{#if:{{#invoke:Présentation|next}}||visibility:hidden;}}">[[Fichier:Arrow Blue Right 001.svg|15px|link={{#invoke:Présentation|next}}]]</span>
{{#invoke:Présentation|current}}/{{#invoke:Présentation|total}}
</p>
</div>
{{#if:{{{1|}}}|{{DISPLAYTITLE:{{{1}}}}}}}
b9e3e4756cf097facbcd36ee275f6a44eb6768a8
288
287
2015-04-12T21:14:37Z
Seb35
1
syntaxe
wikitext
text/x-wiki
<div id="presentation-bar-left" class="presentation-bar plainlinks">
<p>[[{{NAMESPACE}}:{{ROOTPAGENAME}}|<span style="color:#0645AD;">{{ROOTPAGENAME}}</span>]]<!--
--><span class="presentation-edit"> – [{{fullurl:{{FULLPAGENAME}}|action=edit}} <span style="color:#0645AD;">{{lc:{{int:edit}}}}</span>]</span><!--
--><span class="presentation-purge"> – [{{fullurl:{{FULLPAGENAME}}|action=purge}} <span style="color:#0645AD;">{{lc:{{int:purge}}}}</span>]</span><!--
--><span class="presentation-move"> – [[{{#special:Movepage}}/{{FULLPAGENAME}}|<span style="color:#0645AD;">{{lc:{{int:move}}}}</span>]]</span></p>
</div>
<div id="presentation-bar-right" class="presentation-bar">
<p>
<span style="{{#if:{{#invoke:Présentation|previous}}||visibility:hidden;}}">[[Fichier:Arrow Blue Left 001.svg|15px|link={{#invoke:Présentation|previous}}]]</span>
<span style="{{#if:{{#invoke:Présentation|next}}||visibility:hidden;}}">[[Fichier:Arrow Blue Right 001.svg|15px|link={{#invoke:Présentation|next}}]]</span>
{{#invoke:Présentation|current}}/{{#invoke:Présentation|total}}
</p>
</div>
{{#if:{{{1|}}}|{{DISPLAYTITLE:{{{1}}}}}}}
702af1e3403dad7f07766185186cf42950b9237f
289
288
2015-04-12T21:15:33Z
Seb35
1
syntaxe
wikitext
text/x-wiki
<div id="presentation-bar-left" class="presentation-bar plainlinks">
<p>[[{{NAMESPACE}}:{{ROOTPAGENAME}}|<span style="color:#0645AD;">{{ROOTPAGENAME}}</span>]]<!--
--><span class="presentation-edit"> – [{{fullurl:{{FULLPAGENAME}}|action=edit}} <span style="color:#0645AD;">{{lc:{{int:edit}}}}</span>]</span><!--
--><span class="presentation-purge"> – [{{fullurl:{{FULLPAGENAME}}|action=purge}} <span style="color:#0645AD;">purger</span>]</span><!--
--><span class="presentation-move"> – [[{{#special:Movepage}}/{{FULLPAGENAME}}|<span style="color:#0645AD;">{{lc:{{int:move}}}}</span>]]</span></p>
</div>
<div id="presentation-bar-right" class="presentation-bar">
<p>
<span style="{{#if:{{#invoke:Présentation|previous}}||visibility:hidden;}}">[[Fichier:Arrow Blue Left 001.svg|15px|link={{#invoke:Présentation|previous}}]]</span>
<span style="{{#if:{{#invoke:Présentation|next}}||visibility:hidden;}}">[[Fichier:Arrow Blue Right 001.svg|15px|link={{#invoke:Présentation|next}}]]</span>
{{#invoke:Présentation|current}}/{{#invoke:Présentation|total}}
</p>
</div>
{{#if:{{{1|}}}|{{DISPLAYTITLE:{{{1}}}}}}}
6016cff5b417cee5b3a1d34bae6fe687835f689c
Présentation:Wikis/1
104
99
271
227
2015-04-10T17:20:05Z
Seb35
1
plan
wikitext
text/x-wiki
Plan :
# [[Présentation:Wikis/1/1|Définition d’un wiki]]
# [[Présentation:Wikis/1/2|Historique des wikis]]
# [[Présentation:Wikis/1/3|Focus sur la famille de wikis la plus connue : Wikipédia]]
# [[Présentation:Wikis/1/4|Autres exemples de wikis]]
# [[Présentation:Wikis/1/5|Questions juridiques]]
{{Présentation|Présentation et histoire des wikis}}
827652824b85ec037f8798ad9d6bd4c2bb5f355c
285
271
2015-04-12T20:54:52Z
Seb35
1
lien
wikitext
text/x-wiki
Plan :
# [[Présentation:Wikis/1/1|Définition d’un wiki]]
# [[Présentation:Wikis/1/2|Historique des wikis]]
# [[Présentation:Wikis/1/3|Focus sur la famille de wikis la plus connue : Wikipédia]]
# [[Présentation:Wikis/1/4/1|Autres exemples de wikis]] : [[Présentation:Wikis/1/4/1|bases de connaissances thématiques]], [[Présentation:Wikis/1/4/2|wikis de travail]]
# [[Présentation:Wikis/1/5|Questions juridiques]]
{{Présentation|Présentation et histoire des wikis}}
db5e4b21cc59c0ac77cd61a8a67a20b124585b7f
293
285
2015-04-12T21:37:46Z
Seb35
1
typo
wikitext
text/x-wiki
Plan :
# [[Présentation:Wikis/1/1|Définition d’un wiki]]
# [[Présentation:Wikis/1/2|Historique des wikis]]
# [[Présentation:Wikis/1/3|Focus sur la famille de wikis la plus connue : Wikipédia]]
# [[Présentation:Wikis/1/4/1|Autres exemples de wikis]] : [[Présentation:Wikis/1/4/1|bases de connaissances thématiques]] et [[Présentation:Wikis/1/4/2|wikis de travail]]
# [[Présentation:Wikis/1/5|Questions juridiques]]
{{Présentation|Présentation et histoire des wikis}}
6eba7faec06f86dd2ceb68c60e667ce0c48050d8
Présentation:Wikis/1/1
104
101
272
248
2015-04-10T17:21:10Z
Seb35
1
Seb35 a déplacé la page [[Présentation:Wikis/2]] vers [[Présentation:Wikis/1/1]] sans laisser de redirection : utilisation de la fonctionnalité "hiérarchique"
wikitext
text/x-wiki
<div class="plainlinks" style="width:70%; margin-top:4.5em; margin-left:5%;"><div style="border:1px dotted #9B85BE; padding: 0.5em 1em;">
<span style="color:#9B85BE;">'''WIKI'''</span>
<div style="float:left; color:#717171; background-color:#EEEEEE; line-height: 1.3em; margin-right:0.5em;">[[Fichier:Tamponsmots wiki.jpg|none]]©Polysémique</div>
<span style="color:#9B85BE;">DÉFINITION(S)</span><br />
Wiki [wiki] n. m. – ÉTYM. 2003, mot anglais américain, abréviation de WikiWikiWeb, nom du site créé par W. Cunningham en 1995, de l’hawaïen wiki wiki « vite »
Site web collaboratif dont le contenu peut être librement modifié par les visiteurs autorisés. Le développement des wikis. APPOS. Site, encyclopédie wiki.
<span style="color:#9B85BE;">ORIGINE</span><br />
Origine hawaïenne, terme emprunté par l’intermédiaire de l’anglais, lexicalisé en 2003
<span style="color:#9B85BE;">CITATIONS FRANÇAISES</span><br />
« Les wikis reposent sur une conception non individualiste de la connaissance. Il ne s’agit pas de revendiquer la propriété d’un contenu, mais de contribuer à une aventure collective. »
Jérôme Delacroix, ''Les Wikis''
</div>
Le mot « wiki » est un des mots à utiliser dans le concours de poésie et d’art ''[http://www.dismoidixmots.culture.fr/ressources/la-thematique-et-les-dix-mots Dis-moi dix mots]'', édition 2014–2015.
</div>
{{Présentation|Définition d’un wiki}}
2a1bdc0f52203f7f2a84c76e8393ce3bbdc47ad4
Présentation:Wikis/1/2
104
105
276
2015-04-10T17:53:14Z
Seb35
1
init
wikitext
text/x-wiki
<div style="height:33%;">1995 : création de l’outil par Ward Cunningham</div>
<div style="height:33%;">2001 : lancement de Wikipédia</div>
<div style="height:33%;">2006-2010 : popularisation de Wikipédia et de l’outil</div>
{{Présentation|Historique des wikis}}
cf6d6b672dc3658b9d0bc72932a4730a75c7ea02
296
276
2015-04-12T22:35:36Z
Seb35
1
+image
wikitext
text/x-wiki
<div style="height:33%;">1995 : création de l’outil par Ward Cunningham</div>
<div style="height:33%;">2001 : lancement de Wikipédia
[[Fichier:Old Wikipedia.png|right|Page d’accueil de Wikipédia le 28 septembre 2002]]</div>
<div style="height:33%;">2006-2010 : popularisation de Wikipédia et de l’outil</div>
{{Présentation|Historique des wikis}}
41f16aa8371bd6ac786e65d7a5b97e1273538348
297
296
2015-04-12T22:37:39Z
Seb35
1
mise en page
wikitext
text/x-wiki
<div style="height:33%;">1995 : création de l’outil par Ward Cunningham</div>
<div style="height:33%;">2001 : lancement de Wikipédia
[[Fichier:Old Wikipedia.png|right|60px|Page d’accueil de Wikipédia le 28 septembre 2002]]</div>
<div style="height:33%;">2006-2010 : popularisation de Wikipédia et de l’outil</div>
{{Présentation|Historique des wikis}}
a00000738dfae9cb6b10856c67f8eccdcf1a2e57
298
297
2015-04-12T22:39:41Z
Seb35
1
mise en page
wikitext
text/x-wiki
<div style="height:33%;">1995 : création de l’outil par Ward Cunningham</div>
<div style="height:33%;">2001 : lancement de Wikipédia
[[Fichier:Old Wikipedia.png|right|Page d’accueil de Wikipédia le 28 septembre 2002]]</div>
<div style="height:33%;">2006-2010 : popularisation de Wikipédia et de l’outil</div>
{{Présentation|Historique des wikis}}
41f16aa8371bd6ac786e65d7a5b97e1273538348
299
298
2015-04-12T22:43:29Z
Seb35
1
essai
wikitext
text/x-wiki
<div style="height:33%;">1995 : création de l’outil par Ward Cunningham</div>
<div style="height:33%;">2001 : lancement de Wikipédia
[[Fichier:Old Wikipedia.png|class="test"|Page d’accueil de Wikipédia le 28 septembre 2002]]</div>
<div style="height:33%;">2006-2010 : popularisation de Wikipédia et de l’outil</div>
{{Présentation|Historique des wikis}}
f3290904cb628d166e8956fbcf16f2f2740e5c9d
305
299
2015-04-20T10:26:42Z
Seb35
1
mise en page
wikitext
text/x-wiki
<div style="height:33%;">1995 : création de l’outil par Ward Cunningham</div>
<div style="height:33%;">2001 : lancement de Wikipédia
[[Fichier:Old Wikipedia.png|200px|thumb|right|Page d’accueil de Wikipédia le 28 septembre 2002]]</div>
<div style="height:33%;">2006-2010 : popularisation de Wikipédia et de l’outil</div>
{{Présentation|Historique des wikis}}
d43c120429183637f5978b801f0294024f304912
307
305
2015-04-20T10:50:36Z
Seb35
1
++
wikitext
text/x-wiki
<div style="height:33%;">1995 : création de l’outil [[:frwikipedia:WikiWikiWeb|{{noir|WikiWikiWeb}}]] par [[:frwikipedia:Ward Cunningham|{{noir|Ward Cunningham}}]]
* toujours disponible sur http://c2.com/cgi/wiki
* édition en cliquant sur le logo WikiWikiWeb en bas (désactivé en décembre 2014 [http://c2.com/cgi/wiki?WikiWikiSystemNotice {{noir|pour cause de spam}}])
[[Fichier:WikiWikiWeb screenshot.png|200px|thumb|right|Page d’accueil de Wikipédia le 28 septembre 2002]]</div>
<div style="height:33%;">2001 : lancement de Wikipédia
[[Fichier:Old Wikipedia.png|200px|thumb|right|Page d’accueil de Wikipédia le 28 septembre 2002]]</div>
<div style="height:33%;">2006-2010 : popularisation de Wikipédia et de l’outil</div>
{{Présentation|Historique des wikis}}
763b5227ffc6759f9c45858f92732f7c4716c537
311
307
2015-04-20T11:18:58Z
Seb35
1
mise en page
wikitext
text/x-wiki
<div style="height:33%;">1995 : création de l’outil [[:frwikipedia:WikiWikiWeb|{{noir|WikiWikiWeb}}]] par [[:frwikipedia:Ward Cunningham|{{noir|Ward Cunningham}}]]
[[Fichier:WikiWikiWeb screenshot.png|200px|thumb|right|Page d’accueil de WikiWikiWeb en 2003.]]</div>
* toujours disponible sur http://c2.com/cgi/wiki
* édition en cliquant sur le logo WikiWikiWeb en bas (désactivé en décembre 2014 [http://c2.com/cgi/wiki?WikiWikiSystemNotice {{noir|pour cause de spam}}])
<div style="height:33%;">2001 : lancement de Wikipédia
[[Fichier:Old Wikipedia.png|200px|thumb|right|Page d’accueil de Wikipédia le 28 septembre 2002.]]</div>
<div style="height:33%;">2006-2010 : popularisation de Wikipédia et de l’outil</div>
{{Présentation|Historique des wikis}}
2d39aff7f7cb28e9982e5f3af0cae06e84c36795
312
311
2015-04-20T11:19:39Z
Seb35
1
mise en page
wikitext
text/x-wiki
<div style="height:33%;">1995 : création de l’outil [[:frwikipedia:WikiWikiWeb|{{noir|WikiWikiWeb}}]] par [[:frwikipedia:Ward Cunningham|{{noir|Ward Cunningham}}]]
[[Fichier:WikiWikiWeb screenshot.png|200px|thumb|Page d’accueil de WikiWikiWeb en 2003.]]</div>
* toujours disponible sur http://c2.com/cgi/wiki
* édition en cliquant sur le logo WikiWikiWeb en bas (désactivé en décembre 2014 [http://c2.com/cgi/wiki?WikiWikiSystemNotice {{noir|pour cause de spam}}])
<div style="height:33%;">2001 : lancement de Wikipédia
[[Fichier:Old Wikipedia.png|200px|thumb|Page d’accueil de Wikipédia le 28 septembre 2002.]]</div>
<div style="height:33%;">2006-2010 : popularisation de Wikipédia et de l’outil</div>
{{Présentation|Historique des wikis}}
08eca9d5a58ff23446ee92643e9525ae641db1a7
313
312
2015-04-20T11:23:29Z
Seb35
1
mise en page
wikitext
text/x-wiki
<!--
Premier tiers en hauteur
--><div style="height:33%;">
[[Fichier:WikiWikiWeb screenshot.png|200px|thumb|Page d’accueil de WikiWikiWeb en 2003.]]
1995 : création de l’outil [[:frwikipedia:WikiWikiWeb|{{noir|WikiWikiWeb}}]] par [[:frwikipedia:Ward Cunningham|{{noir|Ward Cunningham}}]]
* toujours disponible sur http://c2.com/cgi/wiki
* édition en cliquant sur le logo WikiWikiWeb en bas (désactivé en décembre 2014 [http://c2.com/cgi/wiki?WikiWikiSystemNotice {{noir|pour cause de spam}}])
</div><!--
Deuxième tiers en hauteur
--><div style="height:33%;">
[[Fichier:Old Wikipedia.png|200px|thumb|Page d’accueil de Wikipédia le 28 septembre 2002.]]
2001 : lancement de Wikipédia
</div><!--
Troisième tiers en hauteur
--><div style="height:33%;">
2006-2010 : popularisation de Wikipédia et de l’outil
</div>
{{Présentation|Historique des wikis}}
7d6f7d0330bd55e8f702177ff1dba3780a86e40c
Présentation:Wikis/1/4/1
104
106
277
2015-04-12T19:15:04Z
Seb35
1
init
wikitext
text/x-wiki
<div style="height:50%;"><div style="width:50%;">Vikidia<br />encyclopédie par et pour les enfants</div><div style="width:50%;">Ekopédia<br />savoir-faire en écologie</div></div>
<div style="height:50%;"><div style="width:50%;">Wookieepedia<br />univers Star Wars</div><div style="width:50%;">OWASP<br />sécurité informatique</div></div>
{{Présentation|Autres exemples de wikis : bases de connaissances thématiques}}
2dacac3edc9d043d73763ccef43c228daeb6b572
278
277
2015-04-12T19:15:57Z
Seb35
1
Seb35 a déplacé la page [[Présentation:Wikis/1/3]] vers [[Présentation:Wikis/1/3/1]] sans laisser de redirection
wikitext
text/x-wiki
<div style="height:50%;"><div style="width:50%;">Vikidia<br />encyclopédie par et pour les enfants</div><div style="width:50%;">Ekopédia<br />savoir-faire en écologie</div></div>
<div style="height:50%;"><div style="width:50%;">Wookieepedia<br />univers Star Wars</div><div style="width:50%;">OWASP<br />sécurité informatique</div></div>
{{Présentation|Autres exemples de wikis : bases de connaissances thématiques}}
2dacac3edc9d043d73763ccef43c228daeb6b572
281
278
2015-04-12T20:50:13Z
Seb35
1
Seb35 a déplacé la page [[Présentation:Wikis/1/3/1]] vers [[Présentation:Wikis/1/4/1]] sans laisser de redirection
wikitext
text/x-wiki
<div style="height:50%;"><div style="width:50%;">Vikidia<br />encyclopédie par et pour les enfants</div><div style="width:50%;">Ekopédia<br />savoir-faire en écologie</div></div>
<div style="height:50%;"><div style="width:50%;">Wookieepedia<br />univers Star Wars</div><div style="width:50%;">OWASP<br />sécurité informatique</div></div>
{{Présentation|Autres exemples de wikis : bases de connaissances thématiques}}
2dacac3edc9d043d73763ccef43c228daeb6b572
Présentation:Wikis/1/4/2
104
107
279
2015-04-12T19:19:37Z
Seb35
1
init
wikitext
text/x-wiki
<div style="width:50%;"><div style="height:50%;"></div><div style="height:50%;"></div></div>
<div style="width:50%;"></div>
{{Présentation|Autres exemples de wikis : wikis de travail}}
e418fdc4dc78ef60b71a7c0fc051f7f195a86de5
282
279
2015-04-12T20:50:38Z
Seb35
1
Seb35 a déplacé la page [[Présentation:Wikis/1/3/2]] vers [[Présentation:Wikis/1/4/2]] sans laisser de redirection
wikitext
text/x-wiki
<div style="width:50%;"><div style="height:50%;"></div><div style="height:50%;"></div></div>
<div style="width:50%;"></div>
{{Présentation|Autres exemples de wikis : wikis de travail}}
e418fdc4dc78ef60b71a7c0fc051f7f195a86de5
Présentation:Wikis/1/3
104
108
283
2015-04-12T20:52:01Z
Seb35
1
init
wikitext
text/x-wiki
* multilingue : quasiment 200 langues
* communautés fortes
* objectif spécifique : encyclopédie généraliste
fd4988cbec3cc9fc9a230c14686ff96d760e99c3
284
283
2015-04-12T20:52:38Z
Seb35
1
+titre
wikitext
text/x-wiki
* multilingue : quasiment 200 langues
* communautés fortes
* objectif spécifique : encyclopédie généraliste
{{Présentation|Focus sur la famille de wikis la plus connue : Wikipédia}}
e1af404984d95eb76be093ba42d448eeadd099fb
Modèle:Présentation/Wikis
10
109
286
2015-04-12T21:00:05Z
Seb35
1
page pour activer le debug
wikitext
text/x-wiki
debug=true
1dc04b6163c4228434a085f3cdcaa6bc51d9142d
MediaWiki:Common.css
8
4
290
246
2015-04-12T21:17:44Z
Seb35
1
display none présentation
css
text/css
/* Contenu en couleur noire et non grise */
div#content {
color: black;
}
/* Code en couleur grise */
pre, code, tt, kbd, samp, .mw-code {
color: #252525;
}
/* Espace de noms Présentation avec un style « diapositives » */
.ns-104.action-view {
background: white;
height: 96%;
}
.ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer, .ns-104 #contentSub {
display: none;
}
.ns-104.action-view #content {
width: 90%;
height: 95%;
margin: 1% auto;
padding: 1em;
border: 1px solid #A7D7F9;
}
.ns-104 h1, .ns-104 h2, .ns-104 h3, .ns-104 h4, .ns-104 h5, .ns-104 h6 {
border-bottom: 0px;
}
.ns-104 .presentation-bar {
font-size: 80%;
}
.ns-104 #presentation-bar-left, .ns-104 #presentation-bar-right {
position: fixed;
bottom: 2%;
}
.ns-104 #presentation-bar-left {
left: 5%
}
.ns-104 #presentation-bar-right {
right: 5%;
}
.ns-104 .presentation-purge, .ns-104 .presentation-move {
display: none;
}
e4dfa5c20aa0ea9fbfe86a8ab221b637dc07d977
294
290
2015-04-12T21:58:20Z
Seb35
1
style présentation
css
text/css
/* Contenu en couleur noire et non grise */
div#content {
color: black;
}
/* Code en couleur grise */
pre, code, tt, kbd, samp, .mw-code {
color: #252525;
}
/* Espace de noms Présentation avec un style « diapositives » */
.ns-104.action-view {
background: white;
height: 95%;
}
.ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer, .ns-104 #contentSub {
display: none;
}
.ns-104.action-view #content {
width: 90%;
height: 95%;
margin: 1% auto;
padding: 1em;
border: 1px solid #A7D7F9;
}
.ns-104.action-view #bodyContent {
height: 100%;
}
.ns-104.action-view #mw-content-text {
height: 100%;
}
.ns-104 h1, .ns-104 h2, .ns-104 h3, .ns-104 h4, .ns-104 h5, .ns-104 h6 {
border-bottom: 0px;
}
.ns-104 .presentation-bar {
font-size: 80%;
}
.ns-104 #presentation-bar-left, .ns-104 #presentation-bar-right {
position: fixed;
bottom: 2%;
}
.ns-104 #presentation-bar-left {
left: 5%
}
.ns-104 #presentation-bar-right {
right: 5%;
}
.ns-104 .presentation-purge, .ns-104 .presentation-move {
display: none;
}
2dae9c149ff7abaee48c869c0575a6da6206ccfb
295
294
2015-04-12T22:04:36Z
Seb35
1
style présentation
css
text/css
/* Contenu en couleur noire et non grise */
div#content {
color: black;
}
/* Code en couleur grise */
pre, code, tt, kbd, samp, .mw-code {
color: #252525;
}
/* Espace de noms Présentation avec un style « diapositives » */
.ns-104.action-view {
background: white;
height: 95%;
}
.ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer, .ns-104 #contentSub {
display: none;
}
.ns-104.action-view #content {
width: 90%;
height: 95%;
margin: 1% auto;
padding: 1em;
border: 1px solid #A7D7F9;
}
.ns-104.action-view #bodyContent {
height: 95%;
}
.ns-104.action-view #mw-content-text {
height: 95%;
}
.ns-104 h1, .ns-104 h2, .ns-104 h3, .ns-104 h4, .ns-104 h5, .ns-104 h6 {
border-bottom: 0px;
}
.ns-104 .presentation-bar {
font-size: 80%;
}
.ns-104 #presentation-bar-left, .ns-104 #presentation-bar-right {
position: fixed;
bottom: 3%;
}
.ns-104 #presentation-bar-left {
left: 5%
}
.ns-104 #presentation-bar-right {
right: 5%;
}
.ns-104 .presentation-purge, .ns-104 .presentation-move {
display: none;
}
0bf3ae9ac2d6b0b0249f086f9bdab61ad4ec2504
308
295
2015-04-20T10:52:56Z
Seb35
1
-icône lien externe dans les présentations
css
text/css
/* Contenu en couleur noire et non grise */
div#content {
color: black;
}
/* Code en couleur grise */
pre, code, tt, kbd, samp, .mw-code {
color: #252525;
}
/* Espace de noms Présentation avec un style « diapositives » */
.ns-104.action-view {
background: white;
height: 95%;
}
.ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer, .ns-104 #contentSub {
display: none;
}
.ns-104.action-view #content {
width: 90%;
height: 95%;
margin: 1% auto;
padding: 1em;
border: 1px solid #A7D7F9;
}
.ns-104.action-view #bodyContent {
height: 95%;
}
.ns-104.action-view #mw-content-text {
height: 95%;
}
.ns-104 h1, .ns-104 h2, .ns-104 h3, .ns-104 h4, .ns-104 h5, .ns-104 h6 {
border-bottom: 0px;
}
.ns-104 .presentation-bar {
font-size: 80%;
}
.ns-104 #presentation-bar-left, .ns-104 #presentation-bar-right {
position: fixed;
bottom: 3%;
}
.ns-104 #presentation-bar-left {
left: 5%
}
.ns-104 #presentation-bar-right {
right: 5%;
}
.ns-104 .presentation-purge, .ns-104 .presentation-move {
display: none;
}
.ns-104.mw-body .external {
background: none;
}
da5a3894cc0bb8b967b7affe40dd1bbb97f59226
309
308
2015-04-20T10:55:22Z
Seb35
1
re
css
text/css
/* Contenu en couleur noire et non grise */
div#content {
color: black;
}
/* Code en couleur grise */
pre, code, tt, kbd, samp, .mw-code {
color: #252525;
}
/* Espace de noms Présentation avec un style « diapositives » */
.ns-104.action-view {
background: white;
height: 95%;
}
.ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer, .ns-104 #contentSub {
display: none;
}
.ns-104.action-view #content {
width: 90%;
height: 95%;
margin: 1% auto;
padding: 1em;
border: 1px solid #A7D7F9;
}
.ns-104.action-view #bodyContent {
height: 95%;
}
.ns-104.action-view #mw-content-text {
height: 95%;
}
.ns-104 h1, .ns-104 h2, .ns-104 h3, .ns-104 h4, .ns-104 h5, .ns-104 h6 {
border-bottom: 0px;
}
.ns-104 .presentation-bar {
font-size: 80%;
}
.ns-104 #presentation-bar-left, .ns-104 #presentation-bar-right {
position: fixed;
bottom: 3%;
}
.ns-104 #presentation-bar-left {
left: 5%
}
.ns-104 #presentation-bar-right {
right: 5%;
}
.ns-104 .presentation-purge, .ns-104 .presentation-move {
display: none;
}
.ns-104 .mw-body .external {
background: none;
}
24b9f5e650660f40161ea54ea985d26252e57650
310
309
2015-04-20T10:56:28Z
Seb35
1
re
css
text/css
/* Contenu en couleur noire et non grise */
div#content {
color: black;
}
/* Code en couleur grise */
pre, code, tt, kbd, samp, .mw-code {
color: #252525;
}
/* Espace de noms Présentation avec un style « diapositives » */
.ns-104.action-view {
background: white;
height: 95%;
}
.ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer, .ns-104 #contentSub {
display: none;
}
.ns-104.action-view #content {
width: 90%;
height: 95%;
margin: 1% auto;
padding: 1em;
border: 1px solid #A7D7F9;
}
.ns-104.action-view #bodyContent {
height: 95%;
}
.ns-104.action-view #mw-content-text {
height: 95%;
}
.ns-104 h1, .ns-104 h2, .ns-104 h3, .ns-104 h4, .ns-104 h5, .ns-104 h6 {
border-bottom: 0px;
}
.ns-104 .presentation-bar {
font-size: 80%;
}
.ns-104 #presentation-bar-left, .ns-104 #presentation-bar-right {
position: fixed;
bottom: 3%;
}
.ns-104 #presentation-bar-left {
left: 5%
}
.ns-104 #presentation-bar-right {
right: 5%;
}
.ns-104 .presentation-purge, .ns-104 .presentation-move {
display: none;
}
.ns-104 .mw-body .external {
background: none;
padding-right: 0px;
}
5556257a2d0ffbe22ad1cbd19eb26d85d5c2f9fc
314
310
2015-04-20T12:50:45Z
Seb35
1
style des liens dans les présentations
css
text/css
/* Contenu en couleur noire et non grise */
div#content {
color: black;
}
/* Code en couleur grise */
pre, code, tt, kbd, samp, .mw-code {
color: #252525;
}
/* Espace de noms Présentation avec un style « diapositives » */
.ns-104.action-view {
background: white;
height: 95%;
}
.ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer, .ns-104 #contentSub {
display: none;
}
.ns-104.action-view #content {
width: 90%;
height: 95%;
margin: 1% auto;
padding: 1em;
border: 1px solid #A7D7F9;
}
.ns-104.action-view #bodyContent {
height: 95%;
}
.ns-104.action-view #mw-content-text {
height: 95%;
}
.ns-104 h1, .ns-104 h2, .ns-104 h3, .ns-104 h4, .ns-104 h5, .ns-104 h6 {
border-bottom: 0px;
}
.ns-104 .presentation-bar {
font-size: 80%;
}
.ns-104 #presentation-bar-left, .ns-104 #presentation-bar-right {
position: fixed;
bottom: 3%;
}
.ns-104 #presentation-bar-left {
left: 5%
}
.ns-104 #presentation-bar-right {
right: 5%;
}
.ns-104 .presentation-purge, .ns-104 .presentation-move {
display: none;
}
/* Spécifique à la présentation sur les wikis */
.ns-104 .mw-body .external {
background: none;
padding-right: 0px;
}
.ns-104 .mw-body a.extiw, .ns-104 .mw-body a.extiw:active,
.ns-104 .mw-body .external.text, .ns-104 .mw-body .external.text:active {
color: black;
text-decoration: none;
}
5c2efa3d21248b60fe3d60682fa8f061885fa504
Utilisateur:Seb35/common.css
2
110
291
2015-04-12T21:19:48Z
Seb35
1
display présentation
css
text/css
.ns-104 .presentation-edit, .ns-104 .presentation-purge, .ns-104 .presentation-move {
display: inherit;
}
f85f06e242282dd2bd62b590b541d4e92ed9f943
292
291
2015-04-12T21:34:02Z
Seb35
1
style présentation
css
text/css
.ns-104 .presentation-edit, .ns-104 .presentation-purge, .ns-104 .presentation-move {
display: inline;
}
54a751ac4702d9186a47a43718a4d44f1e02c400
Modèles économiques alternatifs
0
111
300
2015-04-13T13:16:53Z
Seb35
1
premier jet
wikitext
text/x-wiki
Dans le cadre de [[:seb35:|mon entreprise]] (conseil en logiciels libres et création de logiciels libres), je m’intéresse à des modèles économiques « ''alternatifs'' » : le modèle économique dominant (achat-vente de biens et services ou autres valeurs, avec une notion d’échange de propriété) est peu adapté aux logiciels libres et plus largement aux [Biens] Communs immatériels – en gros tout ce qui est Connaissance, logiciels ou données ; la notion de propriété étant assez difficile à définir (voir douteuse selon les sensibilités), notamment du fait qu’il n’y a jamais échange mais duplication – on parle parfois d’[[:wikipedia:Économie de l'abondance|économie de l’abondance]].
Cette thématique étant en (co-)construction par de multiples acteurs (mondes associatif, de l’ESS, de l’Internet, et d’autres) et vu qu’il n’existe ni une seule bonne alternative et que les modèles économiques libres dépendent en partie de leur mise en œuvre effective, cette page n’a aucune prétention à sortir du chapeau ''le'' modèle économique libre qui fonctionne (ça n’existe pas) mais plutôt à recenser certains modèles économiques libres (voir [[#Liste de modèles économiques alternatifs]]). Il n’est pas fait mention des systèmes économiques plus globaux (économie du don/de l’abondance/d’usage/etc.) qui relèvent plus d’une part de la philosophie et d’autre part de l’effet d’échelle. D’autre part, il existe plusieurs sites et ressources sur le sujet (voir [[#Ressources]]).
== Liste de modèles économiques alternatifs ==
* Bénévolat : offre de temps pour la réalisation de tâches, généralement d’intérêt général
** Bénévolat avec contrat de travail : bénévole régi par le même droit du travail qu’un salarié (droits et devoirs, temps de travail, accès aux ressources de la société, avantages réservés, etc.)
* Don : financement inconditionnel d’un projet, pouvant être demandé avant, après ou pendant la réalisation d’un projet
** Microdon : petits dons destiné au financement de projets
*** à-la-Gratipay : microdons réguliers (hebdomadaires) attribués soit à une personne (sous-entendu pour les projets libres dont elle s’occupe) soit à un groupe de personnes s’occupant d’un projet et qui se répartissent la somme au sein du groupe
*** à-la-Flattr : microdons réguliers (mensuels) attribués à une personnes (sous-entendu pour les projets libres dont elle s’occupe)
** Hackadon : collecte auprès de grands donateurs puis redistribution entre plusieurs projets libres décidée collectivement lors d’un événement [http://www.withoutmodel.com/hugo-stephan/hackadon-soutenez-les-openmodels/ description sur WithoutModel]
** Financement participatif : dons demandés et affectés à un projet dans le cadre d’une campagne de communication, souvent avec un objectif de montant total minimum conditionnant le versement du financement
*** Financement participatif de matériel : classiquement les financements participatifs financent du matériel nécessaire au projet, le temps de travail associé est bénévole ou rémunéré selon un autre mode de financement
*** Financement participatif de temps de travail : financement du temps de travail nécessaire à la réalisation d’un projet normalement libre
*** Financement participatif pour production de matériels : pré-achat d’un objet matériel, pour éviter au vendeur d’avoir à supporter les coûts de production ainsi que le risque de non-vente d’une partie du stock produit
* Avantages fiscaux : financement par non-imposition ou réduction d’imposition lié au statut d’intérêt général de projets
** Crédit d’impôt Recherche : en France, réduction partielle de l’impôt sur les sociétés ou sur le revenu pour les activités de recherche et R&D
** Jeune entreprise innovante : en France, réduction des impôts pour les jeunes entreprises ayant des activités de recherche et R&D
* Prix libre : vente classique d’un produit ou service à un prix librement décidé par l’acheteur
** Prix libre avec minimum : prix libre avec un minimum, par exemple correspondant au prix de revient
* Subventionnement : financement généralement assez important dans le cadre d’une convention ou d’un contrat
** Subvention de fonctionnement : financement d’un projet avec une latitude d’utilisation du financement assez large, non-affectée de façon très spécifique
* Troc : échange de services
** S.E.L. (Système d’Échange Local) : échange de services généralement indexé plus ou moins indirectement sur le temps passé
* Financement par la création de fonctionnalités critiques ou le support : pour les logiciels ou services libres (sans aucune restriction), financement du projet global par financement venant de quelques grands clients demandant de nouvelles fonctionnalités critiques ou du support
* Freemium : une partie des fonctionnalités ou accès est gratuite, une autre partie est payante ; généralement un grand nombre de fonctionnalités est disponible gratuitement (pour avoir une base d’utilisateurs assez importante) et un petit nombre de fonctionnalités cible de façon spécifique les clients pouvant se permettre de payer
== Ressources ==
* [http://www.withoutmodel.com WithoutModel]
12a2b917508c96e152ec62e70f3c10d287b1de24
301
300
2015-04-13T13:22:09Z
Seb35
1
précision
wikitext
text/x-wiki
Dans le cadre de [[:seb35:|mon entreprise]] (conseil en logiciels libres et création de logiciels libres), je m’intéresse à des modèles économiques « ''alternatifs'' » : le modèle économique dominant (achat-vente de biens et services ou autres valeurs, avec une notion d’échange de propriété) est peu adapté aux logiciels libres et plus largement aux [Biens] Communs immatériels – en gros tout ce qui est Connaissance, logiciels ou données ; la notion de propriété étant assez difficile à définir (voir douteuse selon les sensibilités), notamment du fait qu’il n’y a jamais échange mais duplication – on parle parfois d’[[:wikipedia:Économie de l'abondance|économie de l’abondance]].
Cette thématique étant en (co-)construction par de multiples acteurs (mondes associatif, de l’ESS, de l’Internet, et d’autres) et vu qu’il n’existe ni une seule bonne alternative et que les modèles économiques libres dépendent en partie de leur mise en œuvre effective, cette page n’a aucune prétention à sortir du chapeau ''le'' modèle économique libre qui fonctionne (ça n’existe pas) mais plutôt à recenser certains modèles économiques libres (voir [[#Liste de modèles économiques alternatifs]]). Il n’est pas fait mention des systèmes économiques plus globaux (économie du don/de l’abondance/d’usage/etc.) qui relèvent plus d’une part de la philosophie et d’autre part de l’effet d’échelle. D’autre part, il existe plusieurs sites et ressources sur le sujet (voir [[#Ressources]]).
== Liste de modèles économiques alternatifs ==
* Bénévolat : offre de temps pour la réalisation de tâches, généralement d’intérêt général
** Bénévolat avec contrat de travail : bénévole régi par le même droit du travail qu’un salarié (droits et devoirs, temps de travail, accès aux ressources de la société, avantages réservés, etc.)
* Don : financement inconditionnel d’un projet, pouvant être demandé avant, après ou pendant la réalisation d’un projet
** Microdon : petits dons destiné au financement de projets
*** à-la-Gratipay : microdons réguliers (hebdomadaires) attribués soit à une personne (sous-entendu pour les projets libres dont elle s’occupe) soit à un groupe de personnes s’occupant d’un projet et qui se répartissent la somme au sein du groupe
*** à-la-Flattr : microdons réguliers (mensuels) attribués à une personnes (sous-entendu pour les projets libres dont elle s’occupe)
** Hackadon : collecte auprès de grands donateurs puis redistribution entre plusieurs projets libres décidée collectivement lors d’un événement [http://www.withoutmodel.com/hugo-stephan/hackadon-soutenez-les-openmodels/ description sur WithoutModel]
** Financement participatif : dons demandés et affectés à un projet dans le cadre d’une campagne de communication, souvent avec un objectif de montant total minimum conditionnant le versement du financement
*** Financement participatif de matériel : classiquement les financements participatifs financent du matériel nécessaire au projet, le temps de travail associé est bénévole ou rémunéré selon un autre mode de financement
*** Financement participatif de temps de travail : financement du temps de travail nécessaire à la réalisation d’un projet normalement libre
*** Financement participatif pour production de matériels : pré-achat d’un objet matériel, pour éviter au vendeur d’avoir à supporter les coûts de production ainsi que le risque de non-vente d’une partie du stock produit
* Avantages fiscaux : financement par non-imposition ou réduction d’imposition lié au statut d’intérêt général de projets
** Crédit d’impôt Recherche : en France, réduction partielle de l’impôt sur les sociétés ou sur le revenu pour les activités de recherche et R&D
** Jeune entreprise innovante : en France, réduction des impôts pour les jeunes entreprises ayant des activités de recherche et R&D
* Prix libre : vente classique d’un produit ou service à un prix librement décidé par l’acheteur
** Prix libre avec minimum : prix libre avec un minimum, par exemple correspondant au prix de revient
* Subventionnement : financement généralement assez important dans le cadre d’une convention ou d’un contrat
** Subvention de fonctionnement : financement d’un projet avec une latitude d’utilisation du financement assez large, non-affectée de façon très spécifique
* Troc : échange de services
** S.E.L. (Système d’Échange Local) : échange de services généralement indexé plus ou moins indirectement sur le temps passé
* Financement par la création de fonctionnalités critiques ou le support : pour les logiciels ou services libres (sans aucune restriction), financement du projet global par financement venant de quelques grands clients demandant de nouvelles fonctionnalités critiques ou du support ; similaire au financement participatif outre le fait que ce sont là des projets sur du long terme et que les financeurs d’une fonctionnalité sont soit uniques/seuls soit en nombre restreint
* Freemium : une partie des fonctionnalités ou accès est gratuite, une autre partie est payante ; généralement un grand nombre de fonctionnalités est disponible gratuitement (pour avoir une base d’utilisateurs assez importante) et un petit nombre de fonctionnalités cible de façon spécifique les clients pouvant se permettre de payer
== Ressources ==
* [http://www.withoutmodel.com WithoutModel]
baaf7d6156697a3dcf79770ce9a181ae7ceb61c4
302
301
2015-04-13T13:26:51Z
Seb35
1
++
wikitext
text/x-wiki
Dans le cadre de [[:seb35:|mon entreprise]] (conseil en logiciels libres et création de logiciels libres), je m’intéresse à des modèles économiques « ''alternatifs'' » : le modèle économique dominant (achat-vente de biens et services ou autres valeurs, avec une notion d’échange de propriété) est peu adapté aux logiciels libres et plus largement aux [Biens] Communs immatériels – en gros tout ce qui est Connaissance, logiciels ou données ; la notion de propriété étant assez difficile à définir (voir douteuse selon les sensibilités), notamment du fait qu’il n’y a jamais échange mais duplication – on parle parfois d’[[:wikipedia:Économie de l'abondance|économie de l’abondance]].
Cette thématique étant en (co-)construction par de multiples acteurs (mondes associatif, de l’ESS, de l’Internet, et d’autres) et vu qu’il n’existe ni une seule bonne alternative et que les modèles économiques libres dépendent en partie de leur mise en œuvre effective, cette page n’a aucune prétention à sortir du chapeau ''le'' modèle économique libre qui fonctionne (ça n’existe pas) mais plutôt à recenser certains modèles économiques libres (voir [[#Liste de modèles économiques alternatifs]]). Il n’est pas fait mention des systèmes économiques plus globaux (économie du don/de l’abondance/d’usage/etc.) qui relèvent plus d’une part de la philosophie et d’autre part de l’effet d’échelle. D’autre part, il existe plusieurs sites et ressources sur le sujet (voir [[#Ressources]]).
== Liste de modèles économiques alternatifs ==
* Bénévolat : offre de temps pour la réalisation de tâches, généralement d’intérêt général
** Bénévolat avec contrat de travail : bénévole régi par le même droit du travail qu’un salarié (droits et devoirs, temps de travail, accès aux ressources de la société, avantages réservés, etc.)
* Mutualisation : financement/investissement collectif par réduction des coûts par la mise en commun d’un projet ou service entre plusieurs personnes ou entités – gain futur et global
* Don : financement inconditionnel d’un projet, pouvant être demandé avant, après ou pendant la réalisation d’un projet
** Microdon : petits dons destiné au financement de projets
*** à-la-Gratipay : microdons réguliers (hebdomadaires) attribués soit à une personne (sous-entendu pour les projets libres dont elle s’occupe) soit à un groupe de personnes s’occupant d’un projet et qui se répartissent la somme au sein du groupe
*** à-la-Flattr : microdons réguliers (mensuels) attribués à une personnes (sous-entendu pour les projets libres dont elle s’occupe)
** Hackadon : collecte auprès de grands donateurs puis redistribution entre plusieurs projets libres décidée collectivement lors d’un événement [http://www.withoutmodel.com/hugo-stephan/hackadon-soutenez-les-openmodels/ description sur WithoutModel]
** Financement participatif : dons demandés et affectés à un projet dans le cadre d’une campagne de communication, souvent avec un objectif de montant total minimum conditionnant le versement du financement
*** Financement participatif de matériel : classiquement les financements participatifs financent du matériel nécessaire au projet, le temps de travail associé est bénévole ou rémunéré selon un autre mode de financement
*** Financement participatif de temps de travail : financement du temps de travail nécessaire à la réalisation d’un projet normalement libre
*** Financement participatif pour production de matériels : pré-achat d’un objet matériel, pour éviter au vendeur d’avoir à supporter les coûts de production ainsi que le risque de non-vente d’une partie du stock produit
* Avantages fiscaux : financement par non-imposition ou réduction d’imposition lié au statut d’intérêt général de projets
** Crédit d’impôt Recherche : en France, réduction partielle de l’impôt sur les sociétés ou sur le revenu pour les activités de recherche et R&D
** Jeune entreprise innovante : en France, réduction des impôts pour les jeunes entreprises ayant des activités de recherche et R&D
* Prix libre : vente classique d’un produit ou service à un prix librement décidé par l’acheteur
** Prix libre avec minimum : prix libre avec un minimum, par exemple correspondant au prix de revient
* Subventionnement : financement généralement assez important dans le cadre d’une convention ou d’un contrat
** Subvention de fonctionnement : financement d’un projet avec une latitude d’utilisation du financement assez large, non-affectée de façon très spécifique
* Troc : échange de services
** S.E.L. (Système d’Échange Local) : échange de services généralement indexé plus ou moins indirectement sur le temps passé
* Financement par la création de fonctionnalités critiques ou le support : pour les logiciels ou services libres (sans aucune restriction), financement du projet global par financement venant de quelques grands clients demandant de nouvelles fonctionnalités critiques ou du support ; similaire au financement participatif outre le fait que ce sont là des projets sur du long terme et que les financeurs d’une fonctionnalité sont soit uniques/seuls soit en nombre restreint
* Freemium : une partie des fonctionnalités ou accès est gratuite, une autre partie est payante ; généralement un grand nombre de fonctionnalités est disponible gratuitement (pour avoir une base d’utilisateurs assez importante) et un petit nombre de fonctionnalités cible de façon spécifique les clients pouvant se permettre de payer
== Ressources ==
* [http://www.withoutmodel.com WithoutModel]
1760247710c984bb6a1274c5491b756db8c84a53
303
302
2015-04-13T13:55:13Z
Seb35
1
+1, début d’une liste de liens
wikitext
text/x-wiki
Dans le cadre de [[:seb35:|mon entreprise]] (conseil en logiciels libres et création de logiciels libres), je m’intéresse à des modèles économiques « ''alternatifs'' » : le modèle économique dominant (achat-vente de biens et services ou autres valeurs, avec une notion d’échange de propriété) est peu adapté aux logiciels libres et plus largement aux [Biens] Communs immatériels – en gros tout ce qui est Connaissance, logiciels ou données ; la notion de propriété étant assez difficile à définir (voir douteuse selon les sensibilités), notamment du fait qu’il n’y a jamais échange mais duplication – on parle parfois d’[[:wikipedia:fr:Économie de l'abondance|économie de l’abondance]].
Cette thématique étant en (co-)construction par de multiples acteurs (mondes associatif, de l’ESS, de l’Internet, et d’autres) et vu qu’il n’existe ni une seule bonne alternative et que les modèles économiques libres dépendent en partie de leur mise en œuvre effective, cette page n’a aucune prétention à sortir du chapeau ''le'' modèle économique libre qui fonctionne (ça n’existe pas) mais plutôt à recenser certains modèles économiques libres (voir [[#Liste de modèles économiques alternatifs]]). Il n’est pas fait mention des systèmes économiques plus globaux (économie du don/de l’abondance/d’usage/etc.) qui relèvent plus d’une part de la philosophie et d’autre part de l’effet d’échelle. D’autre part, il existe plusieurs sites et ressources sur le sujet (voir [[#Ressources]]).
== Liste de modèles économiques alternatifs ==
* Bénévolat : offre de temps pour la réalisation de tâches, généralement d’intérêt général
** Bénévolat avec contrat de travail : bénévole régi par le même droit du travail qu’un salarié (droits et devoirs, temps de travail, accès aux ressources de la société, avantages réservés, etc.)
** Bénévolat contre fourniture de ressources : mise à disposition de ressources nécessaires à la réalisation d’un projet ; par exemple les hackathons dans lesquels les participants bénévoles se voient offerts la nourriture, l’hébergement et la mise à disposition des ressources requises pour le bon achèvement du projet
* Mutualisation : financement/investissement collectif par réduction des coûts par la mise en commun d’un projet ou service entre plusieurs personnes ou entités – gain futur et global
* Don : financement inconditionnel d’un projet, pouvant être demandé avant, après ou pendant la réalisation d’un projet
** Microdon : petits dons destiné au financement de projets
*** à-la-Gratipay : microdons réguliers (hebdomadaires) attribués soit à une personne (sous-entendu pour les projets libres dont elle s’occupe) soit à un groupe de personnes s’occupant d’un projet et qui se répartissent la somme au sein du groupe
*** à-la-Flattr : microdons réguliers (mensuels) attribués à une personnes (sous-entendu pour les projets libres dont elle s’occupe)
** Hackadon : collecte auprès de grands donateurs puis redistribution entre plusieurs projets libres décidée collectivement lors d’un événement [http://www.withoutmodel.com/hugo-stephan/hackadon-soutenez-les-openmodels/ description sur WithoutModel]
** Financement participatif : dons demandés et affectés à un projet dans le cadre d’une campagne de communication, souvent avec un objectif de montant total minimum conditionnant le versement du financement
*** Financement participatif de matériel : classiquement les financements participatifs financent du matériel nécessaire au projet, le temps de travail associé est bénévole ou rémunéré selon un autre mode de financement
*** Financement participatif de temps de travail : financement du temps de travail nécessaire à la réalisation d’un projet normalement libre
*** Financement participatif pour production de matériels : pré-achat d’un objet matériel, pour éviter au vendeur d’avoir à supporter les coûts de production ainsi que le risque de non-vente d’une partie du stock produit
* Avantages fiscaux : financement par non-imposition ou réduction d’imposition lié au statut d’intérêt général de projets
** Crédit d’impôt Recherche : en France, réduction partielle de l’impôt sur les sociétés ou sur le revenu pour les activités de recherche et R&D
** Jeune entreprise innovante : en France, réduction des impôts pour les jeunes entreprises ayant des activités de recherche et R&D
* Prix libre : vente classique d’un produit ou service à un prix librement décidé par l’acheteur
** Prix libre avec minimum : prix libre avec un minimum, par exemple correspondant au prix de revient
* Subventionnement : financement généralement assez important dans le cadre d’une convention ou d’un contrat
** Subvention de fonctionnement : financement d’un projet avec une latitude d’utilisation du financement assez large, non-affectée de façon très spécifique
* Troc : échange de services
** S.E.L. (Système d’Échange Local) : échange de services généralement indexé plus ou moins indirectement sur le temps passé
* Financement par la création de fonctionnalités critiques ou le support : pour les logiciels ou services libres (sans aucune restriction), financement du projet global par financement venant de quelques grands clients demandant de nouvelles fonctionnalités critiques ou du support ; similaire au financement participatif outre le fait que ce sont là des projets sur du long terme et que les financeurs d’une fonctionnalité sont soit uniques/seuls soit en nombre restreint
* Freemium : une partie des fonctionnalités ou accès est gratuite, une autre partie est payante ; généralement un grand nombre de fonctionnalités est disponible gratuitement (pour avoir une base d’utilisateurs assez importante) et un petit nombre de fonctionnalités cible de façon spécifique les clients pouvant se permettre de payer
== Liste de ressources sur les modèles économiques alternatifs ==
=== Freemium ===
* [http://www.withoutmodel.com/chloe-bonnet/open-data-killer-app-leconomie-plate-formes/ ''Open data : de la killer app à l’économie des plate-formes'', par Chloé Bonnet et Romain Lalanne, le 17 février 2015 sur WithoutModel.com]
== Ressources ==
* [http://www.withoutmodel.com WithoutModel]
a0449d76fe4bc672cdb81700bc2afb1b424c6388
304
303
2015-04-13T14:05:30Z
Seb35
1
typo, +ordre dans la liste
wikitext
text/x-wiki
Dans le cadre de [[:seb35:|mon entreprise]] (conseil en logiciels libres et création de logiciels libres), je m’intéresse à des modèles économiques « ''alternatifs'' » : le modèle économique dominant (achat-vente de biens et services ou autres valeurs, avec une notion d’échange de propriété) est peu adapté aux logiciels libres et plus largement aux [Biens] Communs immatériels – en gros tout ce qui est Connaissance, logiciels ou données ; la notion de propriété étant assez difficile à définir (voir douteuse selon les sensibilités), notamment du fait qu’il n’y a jamais échange mais duplication – on parle parfois d’[[:wikipedia:fr:Économie de l'abondance|économie de l’abondance]].
Cette thématique étant en (co-)construction par de multiples acteurs (mondes associatif, de l’ESS, de l’Internet, et d’autres) et vu qu’il n’existe ni une seule bonne alternative et que les modèles économiques libres dépendent en partie de leur mise en œuvre effective, cette page n’a aucune prétention à sortir du chapeau ''le'' modèle économique libre qui fonctionne (ça n’existe pas) mais plutôt à recenser certains modèles économiques libres (voir [[#Liste de modèles économiques alternatifs]]). Il n’est pas fait mention des systèmes économiques plus globaux (économie du don/de l’abondance/d’usage/etc.) qui relèvent plus d’une part de la philosophie et d’autre part de l’effet d’échelle. D’autre part, il existe plusieurs sites et ressources sur le sujet (voir [[#Ressources]]).
== Liste de modèles économiques alternatifs ==
Plus ou moins ordonnée du bénévolat (financement par gratuité extrême) vers l’échange avec une plus grande part de monnaie impliquée (financement plus inscrit dans le modèle économique achat-vente).
* '''Bénévolat''' : offre de temps pour la réalisation de tâches, généralement d’intérêt général
** '''Bénévolat avec contrat de travail''' : bénévole régi par le même droit du travail qu’un salarié (droits et devoirs, temps de travail, accès aux ressources de la société, avantages réservés, etc.)
** '''Bénévolat contre fourniture de ressources''' : mise à disposition de ressources nécessaires à la réalisation d’un projet ; par exemple les hackathons dans lesquels les participants bénévoles se voient offerts la nourriture, l’hébergement et la mise à disposition des ressources requises pour le bon achèvement du projet
* '''Mutualisation''' : financement/investissement collectif par réduction des coûts par la mise en commun d’un projet ou service entre plusieurs personnes ou entités – gain futur et global
* '''Don''' : financement inconditionnel d’un projet, pouvant être demandé avant, après ou pendant la réalisation d’un projet
** '''Microdon''' : petits dons destiné au financement de projets
*** '''Microdon à-la-Gratipay''' : microdons réguliers (hebdomadaires) attribués soit à une personne (sous-entendu pour les projets libres dont elle s’occupe) soit à un groupe de personnes s’occupant d’un projet et qui se répartissent la somme au sein du groupe
*** '''Microdon à-la-Flattr''' : microdons réguliers (mensuels) attribués à une personnes (sous-entendu pour les projets libres dont elle s’occupe)
** '''[[#Hackadon|Hackadon]]''' : collecte auprès de grands donateurs puis redistribution entre plusieurs projets libres décidée collectivement lors d’un événement
** '''Financement participatif''' : dons demandés et affectés à un projet dans le cadre d’une campagne de communication, souvent avec un objectif de montant total minimum conditionnant le versement du financement
*** '''Financement participatif de matériel''' : classiquement les financements participatifs financent du matériel nécessaire au projet, le temps de travail associé est bénévole ou rémunéré selon un autre mode de financement
*** '''Financement participatif de temps de travail''' : financement du temps de travail nécessaire à la réalisation d’un projet normalement libre
*** '''Financement participatif pour production de matériels''' : pré-achat d’un objet matériel, pour éviter au vendeur d’avoir à supporter les coûts de production ainsi que le risque de non-vente d’une partie du stock produit
* '''Troc''' : échange de services
** '''S.E.L. (Système d’Échange Local)''' : échange de services généralement indexé plus ou moins indirectement sur le temps passé
* '''Prix libre''' : vente classique d’un produit ou service à un prix librement décidé par l’acheteur
** '''Prix libre avec minimum''' : prix libre avec un minimum, par exemple correspondant au prix de revient
* '''Avantages fiscaux''' : financement par non-imposition ou réduction d’imposition lié au statut d’intérêt général de projets
** '''Crédit d’impôt Recherche''' : en France, réduction partielle de l’impôt sur les sociétés ou sur le revenu pour les activités de recherche et R&D
** '''Jeune entreprise innovante''' : en France, réduction des impôts pour les jeunes entreprises ayant des activités de recherche et R&D
* '''Subventionnement''' : financement généralement assez important dans le cadre d’une convention ou d’un contrat
** '''Subvention de fonctionnement''' : financement d’un projet avec une latitude d’utilisation du financement assez large, non-affectée de façon très spécifique
* '''Financement par la création de fonctionnalités critiques ou le support''' : pour les logiciels ou services libres (sans aucune restriction), financement du projet global par financement venant de quelques grands clients demandant de nouvelles fonctionnalités critiques ou du support ; similaire au financement participatif outre le fait que ce sont là des projets sur du long terme et que les financeurs d’une fonctionnalité sont soit uniques/seuls soit en nombre restreint
* '''[[#Freemium|Freemium]]''' : une partie des fonctionnalités ou accès est gratuite, une autre partie est payante ; généralement un grand nombre de fonctionnalités est disponible gratuitement (pour avoir une base d’utilisateurs assez importante) et un petit nombre de fonctionnalités cible de façon spécifique les clients pouvant se permettre de payer
== Liste de ressources sur les modèles économiques alternatifs ==
=== Hackadon ===
* [http://www.withoutmodel.com/hugo-stephan/hackadon-soutenez-les-openmodels/ ''Hackadon : soutenez les #openmodels'', par Hugo Stéphan, le 23 janvier 2015 sur WithoutModel.com]
=== Freemium ===
* [http://www.withoutmodel.com/chloe-bonnet/open-data-killer-app-leconomie-plate-formes/ ''Open data : de la killer app à l’économie des plate-formes'', par Chloé Bonnet et Romain Lalanne, le 17 février 2015 sur WithoutModel.com]
== Ressources ==
* [http://www.withoutmodel.com WithoutModel]
e7e554686deb13909a33beee5532c5d7a4018395
Modèle:Noir
10
112
306
2015-04-20T10:49:01Z
Seb35
1
création
wikitext
text/x-wiki
<span style="color:black;">{{{1}}}</span>
328eb39b232f88c21e394337b54b8a08b17389d6
MediaWiki:Common.css
8
4
315
314
2015-04-20T13:02:35Z
Seb35
1
re
css
text/css
/* Contenu en couleur noire et non grise */
div#content {
color: black;
}
/* Code en couleur grise */
pre, code, tt, kbd, samp, .mw-code {
color: #252525;
}
/* Espace de noms Présentation avec un style « diapositives » */
.ns-104.action-view {
background: white;
height: 95%;
}
.ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer, .ns-104 #contentSub {
display: none;
}
.ns-104.action-view #content {
width: 90%;
height: 95%;
margin: 1% auto;
padding: 1em;
border: 1px solid #A7D7F9;
}
.ns-104.action-view #bodyContent {
height: 95%;
}
.ns-104.action-view #mw-content-text {
height: 95%;
}
.ns-104 h1, .ns-104 h2, .ns-104 h3, .ns-104 h4, .ns-104 h5, .ns-104 h6 {
border-bottom: 0px;
}
.ns-104 .presentation-bar {
font-size: 80%;
}
.ns-104 #presentation-bar-left, .ns-104 #presentation-bar-right {
position: fixed;
bottom: 3%;
}
.ns-104 #presentation-bar-left {
left: 5%
}
.ns-104 #presentation-bar-right {
right: 5%;
}
.ns-104 .presentation-purge, .ns-104 .presentation-move {
display: none;
}
/* Spécifique à la présentation sur les wikis */
.ns-104 .mw-body .external {
background: none;
padding-right: 0px;
}
.ns-104 .mw-body a.extiw, .ns-104 .mw-body a.extiw:active,
.ns-104 .mw-body .external.text, .ns-104 .mw-body .external.text:active {
color: black;
text-decoration: none;
border-bottom: 1px dotted black;
}
93713fb0ef69ba5cd2934dd04906dc65f9979330
316
315
2015-04-20T13:05:08Z
Seb35
1
dotted au passage de la souris
css
text/css
/* Contenu en couleur noire et non grise */
div#content {
color: black;
}
/* Code en couleur grise */
pre, code, tt, kbd, samp, .mw-code {
color: #252525;
}
/* Espace de noms Présentation avec un style « diapositives » */
.ns-104.action-view {
background: white;
height: 95%;
}
.ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer, .ns-104 #contentSub {
display: none;
}
.ns-104.action-view #content {
width: 90%;
height: 95%;
margin: 1% auto;
padding: 1em;
border: 1px solid #A7D7F9;
}
.ns-104.action-view #bodyContent {
height: 95%;
}
.ns-104.action-view #mw-content-text {
height: 95%;
}
.ns-104 h1, .ns-104 h2, .ns-104 h3, .ns-104 h4, .ns-104 h5, .ns-104 h6 {
border-bottom: 0px;
}
.ns-104 .presentation-bar {
font-size: 80%;
}
.ns-104 #presentation-bar-left, .ns-104 #presentation-bar-right {
position: fixed;
bottom: 3%;
}
.ns-104 #presentation-bar-left {
left: 5%
}
.ns-104 #presentation-bar-right {
right: 5%;
}
.ns-104 .presentation-purge, .ns-104 .presentation-move {
display: none;
}
/* Spécifique à la présentation sur les wikis */
.ns-104 .mw-body .external {
background: none;
padding-right: 0px;
}
.ns-104 .mw-body a.extiw, .ns-104 .mw-body a.extiw:active,
.ns-104 .mw-body .external, .ns-104 .mw-body .external:active {
color: black;
text-decoration: none;
}
.ns-104 .mw-body a.extiw:active,
.ns-104 .mw-body .external.text:active,
.ns-104 .mw-body .external.free:active {
border-bottom: 1px dotted black;
}
dd4c165419cda67855fecf1a05bccab5e9da0bcd
317
316
2015-04-20T13:06:38Z
Seb35
1
re
css
text/css
/* Contenu en couleur noire et non grise */
div#content {
color: black;
}
/* Code en couleur grise */
pre, code, tt, kbd, samp, .mw-code {
color: #252525;
}
/* Espace de noms Présentation avec un style « diapositives » */
.ns-104.action-view {
background: white;
height: 95%;
}
.ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer, .ns-104 #contentSub {
display: none;
}
.ns-104.action-view #content {
width: 90%;
height: 95%;
margin: 1% auto;
padding: 1em;
border: 1px solid #A7D7F9;
}
.ns-104.action-view #bodyContent {
height: 95%;
}
.ns-104.action-view #mw-content-text {
height: 95%;
}
.ns-104 h1, .ns-104 h2, .ns-104 h3, .ns-104 h4, .ns-104 h5, .ns-104 h6 {
border-bottom: 0px;
}
.ns-104 .presentation-bar {
font-size: 80%;
}
.ns-104 #presentation-bar-left, .ns-104 #presentation-bar-right {
position: fixed;
bottom: 3%;
}
.ns-104 #presentation-bar-left {
left: 5%
}
.ns-104 #presentation-bar-right {
right: 5%;
}
.ns-104 .presentation-purge, .ns-104 .presentation-move {
display: none;
}
/* Spécifique à la présentation sur les wikis */
.ns-104 .mw-body .external {
background: none;
padding-right: 0px;
}
.ns-104 .mw-body a.extiw,
.ns-104 .mw-body .external {
color: black;
text-decoration: none;
}
.ns-104 .mw-body a.extiw:active,
.ns-104 .mw-body .external.text:active,
.ns-104 .mw-body .external.free:active {
border-bottom: 1px dotted black;
}
035b6013c0e3c20e57838a0d8927cfd61f0db98d
318
317
2015-04-20T13:10:03Z
Seb35
1
re
css
text/css
/* Contenu en couleur noire et non grise */
div#content {
color: black;
}
/* Code en couleur grise */
pre, code, tt, kbd, samp, .mw-code {
color: #252525;
}
/* Espace de noms Présentation avec un style « diapositives » */
.ns-104.action-view {
background: white;
height: 95%;
}
.ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer, .ns-104 #contentSub {
display: none;
}
.ns-104.action-view #content {
width: 90%;
height: 95%;
margin: 1% auto;
padding: 1em;
border: 1px solid #A7D7F9;
}
.ns-104.action-view #bodyContent {
height: 95%;
}
.ns-104.action-view #mw-content-text {
height: 95%;
}
.ns-104 h1, .ns-104 h2, .ns-104 h3, .ns-104 h4, .ns-104 h5, .ns-104 h6 {
border-bottom: 0px;
}
.ns-104 .presentation-bar {
font-size: 80%;
}
.ns-104 #presentation-bar-left, .ns-104 #presentation-bar-right {
position: fixed;
bottom: 3%;
}
.ns-104 #presentation-bar-left {
left: 5%
}
.ns-104 #presentation-bar-right {
right: 5%;
}
.ns-104 .presentation-purge, .ns-104 .presentation-move {
display: none;
}
/* Spécifique à la présentation sur les wikis */
.ns-104 .mw-body .external {
background: none;
padding-right: 0px;
}
.ns-104 .mw-body a.extiw, .ns-104 .mw-body a.extiw:active,
.ns-104 .mw-body .external, .ns-104 .mw-body .external:active {
color: black;
text-decoration: none;
}
.ns-104 .mw-body a.extiw:hover,
.ns-104 .mw-body .external:hover {
border-bottom: 1px dotted black;
}
483fa7a352b711530cb337098416147632860a8a
319
318
2015-04-20T13:15:33Z
Seb35
1
taille du texte
css
text/css
/* Contenu en couleur noire et non grise */
div#content {
color: black;
}
/* Code en couleur grise */
pre, code, tt, kbd, samp, .mw-code {
color: #252525;
}
/* Espace de noms Présentation avec un style « diapositives » */
.ns-104.action-view {
background: white;
height: 95%;
}
.ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer, .ns-104 #contentSub {
display: none;
}
.ns-104.action-view #content {
width: 90%;
height: 95%;
margin: 1% auto;
padding: 1em;
border: 1px solid #A7D7F9;
}
.ns-104.action-view #bodyContent {
height: 95%;
}
.ns-104.action-view #mw-content-text {
height: 95%;
}
.ns-104 .mw-body-content {
font-size: 0.975em;
}
.ns-104 h1, .ns-104 h2, .ns-104 h3, .ns-104 h4, .ns-104 h5, .ns-104 h6 {
border-bottom: 0px;
}
.ns-104 .presentation-bar {
font-size: 80%;
}
.ns-104 #presentation-bar-left, .ns-104 #presentation-bar-right {
position: fixed;
bottom: 3%;
}
.ns-104 #presentation-bar-left {
left: 5%
}
.ns-104 #presentation-bar-right {
right: 5%;
}
.ns-104 .presentation-purge, .ns-104 .presentation-move {
display: none;
}
/* Spécifique à la présentation sur les wikis */
.ns-104 .mw-body .external {
background: none;
padding-right: 0px;
}
.ns-104 .mw-body a.extiw, .ns-104 .mw-body a.extiw:active,
.ns-104 .mw-body .external, .ns-104 .mw-body .external:active {
color: black;
text-decoration: none;
}
.ns-104 .mw-body a.extiw:hover,
.ns-104 .mw-body .external:hover {
border-bottom: 1px dotted black;
}
2c57deb15f8dbc91b821d56f05f62a9b87f40dec
323
319
2015-04-20T13:53:51Z
Seb35
1
css
text/css
/* Contenu en couleur noire et non grise */
div#content {
color: black;
}
/* Code en couleur grise */
pre, code, tt, kbd, samp, .mw-code {
color: #252525;
}
/* Espace de noms Présentation avec un style « diapositives » */
.ns-104.action-view {
background: white;
height: 95%;
}
.ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer, .ns-104 #contentSub {
display: none;
}
.ns-104.action-view #content {
width: 90%;
height: 95%;
margin: 1% auto;
padding: 1em;
border: 1px solid #A7D7F9;
}
.ns-104.action-view #bodyContent {
height: 95%;
}
.ns-104.action-view #mw-content-text {
height: 95%;
}
.ns-104 .mw-body-content {
font-size: 0.975em;
}
.ns-104 h1, .ns-104 h2, .ns-104 h3, .ns-104 h4, .ns-104 h5, .ns-104 h6 {
border-bottom: 0px;
}
.ns-104 .presentation-bar {
font-size: 80%;
}
.ns-104 #presentation-bar-left, .ns-104 #presentation-bar-right {
position: fixed;
bottom: 3%;
}
.ns-104 #presentation-bar-left {
left: 5%
}
.ns-104 #presentation-bar-right {
right: 5%;
}
.ns-104 .presentation-purge, .ns-104 .presentation-move {
display: none;
}
/* Spécifique à la présentation sur les wikis */
.ns-104 .mw-body .external {
background: none;
padding-right: 0px;
}
.ns-104 .mw-body a.extiw, .ns-104 .mw-body a.extiw:active,
.ns-104 .mw-body .external, .ns-104 .mw-body .external:active {
color: black;
text-decoration: none;
}
.ns-104 .mw-body a.extiw:hover,
.ns-104 .mw-body .external:hover {
border-bottom: 1px dotted black;
}
.ns-104 ul {
line-height: 2em;
}
895bffaa503e12291bb8eca30be11bb54a0c270b
355
323
2015-04-20T19:29:29Z
Seb35
1
css
text/css
/* Contenu en couleur noire et non grise */
div#content {
color: black;
}
/* Code en couleur grise */
pre, code, tt, kbd, samp, .mw-code {
color: #252525;
}
/* Espace de noms Présentation avec un style « diapositives » */
.ns-104.action-view {
background: white;
height: 95%;
}
.ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer, .ns-104 #contentSub {
display: none;
}
.ns-104.action-view #content {
width: 90%;
height: 95%;
margin: 1% auto;
padding: 1em;
border: 1px solid #A7D7F9;
}
.ns-104.action-view #bodyContent {
height: 95%;
}
.ns-104.action-view #mw-content-text {
height: 95%;
}
.ns-104 .mw-body-content {
font-size: 0.975em;
}
.ns-104 h1, .ns-104 h2, .ns-104 h3, .ns-104 h4, .ns-104 h5, .ns-104 h6 {
border-bottom: 0px;
}
.ns-104 .presentation-bar {
font-size: 80%;
}
.ns-104 #presentation-bar-left, .ns-104 #presentation-bar-right {
position: fixed;
bottom: 3%;
}
.ns-104 #presentation-bar-left {
left: 5%
}
.ns-104 #presentation-bar-right {
right: 5%;
}
.ns-104 .presentation-purge, .ns-104 .presentation-move {
display: none;
}
/* Spécifique à la présentation sur les wikis */
.ns-104 .mw-body .external {
background: none;
padding-right: 0px;
}
.ns-104 .mw-body a.extiw, .ns-104 .mw-body a.extiw:active,
.ns-104 .mw-body .external, .ns-104 .mw-body .external:active {
color: black;
text-decoration: none;
}
.ns-104 .mw-body a.extiw:hover,
.ns-104 .mw-body .external:hover {
border-bottom: 1px dotted black;
}
.ns-104 ul, .ns-104 ol {
line-height: 2em;
}
d86706e35b5e97661495b94f25c0acc47b6ce149
Présentation:Wikis/1/2
104
105
320
313
2015-04-20T13:33:23Z
Seb35
1
style
wikitext
text/x-wiki
<!--
Premier tiers en hauteur
--><div style="height:33%;">
[[Fichier:WikiWikiWeb screenshot.png|200px|thumb|Page d’accueil de WikiWikiWeb en 2003.]]
1995 : création de l’outil [[:frwikipedia:WikiWikiWeb|WikiWikiWeb]] par [[:frwikipedia:Ward Cunningham|Ward Cunningham]]
* toujours disponible sur http://c2.com/cgi/wiki
* édition en cliquant sur le logo WikiWikiWeb en bas (désactivé en décembre 2014 [http://c2.com/cgi/wiki?WikiWikiSystemNotice pour cause de spam])
</div><!--
Deuxième tiers en hauteur
--><div style="height:33%;">
[[Fichier:Old Wikipedia.png|200px|thumb|Page d’accueil de Wikipédia le 28 septembre 2002.]]
2001 : lancement de Wikipédia
</div><!--
Troisième tiers en hauteur
--><div style="height:33%;">
2006-2010 : popularisation de Wikipédia et de l’outil
</div>
{{Présentation|Historique des wikis}}
361310864e5ef2cbcf25620818d07ac1983e2a53
321
320
2015-04-20T13:34:44Z
Seb35
1
style
wikitext
text/x-wiki
<!--
Premier tiers en hauteur
--><div style="height:33%;">
[[Fichier:WikiWikiWeb screenshot.png|200px|thumb|Page d’accueil de WikiWikiWeb en 2003.]]
1995 : création de l’outil [[:frwikipedia:WikiWikiWeb|WikiWikiWeb]] par [[:frwikipedia:Ward Cunningham|Ward Cunningham]]
* toujours disponible sur <tt>http://c2.com/cgi/wiki</tt>
* édition en cliquant sur le logo WikiWikiWeb en bas (désactivé en décembre 2014 [http://c2.com/cgi/wiki?WikiWikiSystemNotice pour cause de spam])
</div><!--
Deuxième tiers en hauteur
--><div style="height:33%;">
[[Fichier:Old Wikipedia.png|200px|thumb|Page d’accueil de Wikipédia le 28 septembre 2002.]]
2001 : lancement de Wikipédia
</div><!--
Troisième tiers en hauteur
--><div style="height:33%;">
2006-2010 : popularisation de Wikipédia et de l’outil
</div>
{{Présentation|Historique des wikis}}
810525497136c2ec4adc34a9da7bd8ba9dab97a5
358
321
2015-04-20T19:35:51Z
Seb35
1
simplification du wikitexte
wikitext
text/x-wiki
{{Ligne présentation|3|1|
[[Fichier:WikiWikiWeb screenshot.png|200px|thumb|Page d’accueil de WikiWikiWeb en 2003.]]
1995 : création de l’outil [[:frwikipedia:WikiWikiWeb|WikiWikiWeb]] par [[:frwikipedia:Ward Cunningham|Ward Cunningham]]
* toujours disponible sur <tt>http://c2.com/cgi/wiki</tt>
* édition en cliquant sur le logo WikiWikiWeb en bas (désactivé en décembre 2014 [http://c2.com/cgi/wiki?WikiWikiSystemNotice pour cause de spam])
}}
{{Ligne présentation|3|1|
[[Fichier:Old Wikipedia.png|200px|thumb|Page d’accueil de Wikipédia le 28 septembre 2002.]]
2001 : lancement de Wikipédia
}}
{{Ligne présentation|3|1|
2006-2010 : popularisation de Wikipédia et de l’outil
}}
{{Présentation|Historique des wikis}}
499a486d88c350eb93847fb2fac1d566c9ba5a75
Présentation:Wikis/1/3
104
108
322
284
2015-04-20T13:52:15Z
Seb35
1
++
wikitext
text/x-wiki
<span style="line-height:2em;">
* Multilingue : quasiment 200 langues
** Éditions linguistiques indépendantes : pas de liens éditoriaux entre les langues (mais traductions autorisées)
* Communautés fortes et indépendantes
** Règles régissant la vie en communauté ; par exemple sur la Wikipédia en français, [[:frwikipedia:Wikipédia:Pas d'attaque personnelle|une règle interdit explicitement les attaques personnelles]]
* Objectif spécifique : encyclopédie généraliste
** Piliers fondateurs communs à toutes les langues : [[:frwikipedia:Wikipédia:Wikipédia est une encyclopédie|encyclopédie]], [[:frwikipedia:Wikipédia:Neutralité de point de vue|neutralité]], [[:frwikipedia:Wikipédia:Droit d'auteur|Droit d’auteur]], [[:frwikipedia:Wikipédia:Règles de savoir-vivre|savoir-vivre]], [[:frwikipedia:Wikipédia:Interprétation créative des règles|pas d’autre règle fixe]]
** Décisions éditoriales propres à chaque communauté ; par exemple sur la Wikipédia en français, [[:frwikipedia:Wikipédia:Critères d'admissibilité des articles|des critères d’admissibilité existent <small>et sont détaillés</small>]]
* Statistiques (mars 2015) : [http://www.alexa.com/siteinfo/wikipedia.org 6e site mondial], [https://reportcard.wmflabs.org/graphs/unique_visitors 437 millions de visiteurs par mois], [https://reportcard.wmflabs.org/graphs/pageviews 20 milliards de pages vues par mois], [https://reportcard.wmflabs.org/graphs/active_editors 77 000 contributeurs par mois]
</span>
{{Présentation|Focus sur la famille de wikis la plus connue : Wikipédia}}
8808f99bbb518a240833e61a56e028ab6dfaf224
324
322
2015-04-20T13:54:35Z
Seb35
1
mise en page
wikitext
text/x-wiki
<div style="margin: auto 0;">
* Multilingue : quasiment 200 langues
** Éditions linguistiques indépendantes : pas de liens éditoriaux entre les langues (mais traductions autorisées)
* Communautés fortes et indépendantes
** Règles régissant la vie en communauté ; par exemple sur la Wikipédia en français, [[:frwikipedia:Wikipédia:Pas d'attaque personnelle|une règle interdit explicitement les attaques personnelles]]
* Objectif spécifique : encyclopédie généraliste
** Piliers fondateurs communs à toutes les langues : [[:frwikipedia:Wikipédia:Wikipédia est une encyclopédie|encyclopédie]], [[:frwikipedia:Wikipédia:Neutralité de point de vue|neutralité]], [[:frwikipedia:Wikipédia:Droit d'auteur|Droit d’auteur]], [[:frwikipedia:Wikipédia:Règles de savoir-vivre|savoir-vivre]], [[:frwikipedia:Wikipédia:Interprétation créative des règles|pas d’autre règle fixe]]
** Décisions éditoriales propres à chaque communauté ; par exemple sur la Wikipédia en français, [[:frwikipedia:Wikipédia:Critères d'admissibilité des articles|des critères d’admissibilité existent <small>et sont détaillés</small>]]
* Statistiques (mars 2015) : [http://www.alexa.com/siteinfo/wikipedia.org 6e site mondial], [https://reportcard.wmflabs.org/graphs/unique_visitors 437 millions de visiteurs par mois], [https://reportcard.wmflabs.org/graphs/pageviews 20 milliards de pages vues par mois], [https://reportcard.wmflabs.org/graphs/active_editors 77 000 contributeurs par mois]
</div>
{{Présentation|Focus sur la famille de wikis la plus connue : Wikipédia}}
7e6bcc731f831bf976a0950a5ddc0bcf430fd4fa
325
324
2015-04-20T14:09:20Z
Seb35
1
++
wikitext
text/x-wiki
<div style="margin: auto 0;">
* Multilingue : quasiment 200 langues
** Éditions linguistiques indépendantes : pas de liens éditoriaux entre les langues (mais traductions autorisées)
* Communautés fortes et indépendantes
** Règles régissant la vie en communauté — par ex. sur fr.WP, [[:frwikipedia:Wikipédia:Pas d'attaque personnelle|une règle interdit explicitement les attaques personnelles]]
** Différents statuts variant selon les communautés
* Objectif spécifique : encyclopédie généraliste
** Piliers fondateurs communs : [[:frwikipedia:Wikipédia:Wikipédia est une encyclopédie|encyclopédie]], [[:frwikipedia:Wikipédia:Neutralité de point de vue|neutralité]], [[:frwikipedia:Wikipédia:Droit d'auteur|droit d’auteur]], [[:frwikipedia:Wikipédia:Règles de savoir-vivre|savoir-vivre]], [[:frwikipedia:Wikipédia:Interprétation créative des règles|pas d’autre règle fixe]]
** Décisions éditoriales locales — par ex. sur fr.WP, [[:frwikipedia:Wikipédia:Critères d'admissibilité des articles|des critères d’admissibilité existent <small>(et sont détaillés)</small>]]
* Statistiques (mars 2015) : [http://www.alexa.com/siteinfo/wikipedia.org 6e site mondial], [https://reportcard.wmflabs.org/graphs/unique_visitors 437 millions de visiteurs par mois], [https://reportcard.wmflabs.org/graphs/pageviews 20 milliards de pages vues par mois], [https://reportcard.wmflabs.org/graphs/active_editors 77 000 contributeurs par mois]
* Un logiciel conçu pour Wikipédia : [[:mw:|MediaWiki]] (moteur de wiki)
</div>
{{Présentation|Focus sur la famille de wikis la plus connue : Wikipédia}}
e3595c320949371d64de519af51918fcf96e6481
Fichier:Vikidia 2015-04-20.png
6
113
326
2015-04-20T14:18:58Z
Seb35
1
Utilisation pour illustration de [[Présentation:Wikis]]. Possiblement des éléments sont sous droit d’auteur.
wikitext
text/x-wiki
Utilisation pour illustration de [[Présentation:Wikis]]. Possiblement des éléments sont sous droit d’auteur.
06c959dab9ac467dfa55d90dd26e294ebdb4c72e
337
326
2015-04-20T15:17:08Z
Seb35
1
+lien
wikitext
text/x-wiki
Utilisation pour illustration de [[Présentation:Wikis]]. Possiblement des éléments sont sous droit d’auteur.
Page originale : https://fr.vikidia.org/
89ec90a119a584ca2f64da03605731c656a0972f
Fichier:Ékopédia 2015-04-20.png
6
114
327
2015-04-20T14:19:46Z
Seb35
1
Utilisation pour illustration de [[Présentation:Wikis]]. Possiblement des éléments sont sous droit d’auteur.
wikitext
text/x-wiki
Utilisation pour illustration de [[Présentation:Wikis]]. Possiblement des éléments sont sous droit d’auteur.
06c959dab9ac467dfa55d90dd26e294ebdb4c72e
339
327
2015-04-20T15:18:13Z
Seb35
1
+lien
wikitext
text/x-wiki
Utilisation pour illustration de [[Présentation:Wikis]]. Possiblement des éléments sont sous droit d’auteur.
Page originale : http://fr.ekopedia.org/
7ea0817c8a631bb95f5dcad3aea39f0046e7d287
Fichier:OWASP 2015-04-20.png
6
115
328
2015-04-20T14:21:10Z
Seb35
1
Utilisation pour illustration de [[Présentation:Wikis]]. Possiblement des éléments sont sous droit d’auteur.
wikitext
text/x-wiki
Utilisation pour illustration de [[Présentation:Wikis]]. Possiblement des éléments sont sous droit d’auteur.
06c959dab9ac467dfa55d90dd26e294ebdb4c72e
340
328
2015-04-20T15:20:39Z
Seb35
1
+lien
wikitext
text/x-wiki
Utilisation pour illustration de [[Présentation:Wikis]]. Possiblement des éléments sont sous droit d’auteur.
Page originale : https://www.owasp.org/
3d8dd4b42a416f0e0d8ed80eee3a293b30adcc2c
Fichier:Wookieepedia 2015-04-20.png
6
116
329
2015-04-20T14:22:01Z
Seb35
1
Utilisation pour illustration de [[Présentation:Wikis]]. Possiblement des éléments sont sous droit d’auteur.
wikitext
text/x-wiki
Utilisation pour illustration de [[Présentation:Wikis]]. Possiblement des éléments sont sous droit d’auteur.
06c959dab9ac467dfa55d90dd26e294ebdb4c72e
341
329
2015-04-20T15:21:09Z
Seb35
1
+lien
wikitext
text/x-wiki
Utilisation pour illustration de [[Présentation:Wikis]]. Possiblement des éléments sont sous droit d’auteur.
Page originale : http://starwars.wikia.com/
a1dcf2fbe9dffb7ce58c800f70d63ecc7fae26aa
Présentation:Wikis/1/4/1
104
106
330
281
2015-04-20T14:37:31Z
Seb35
1
+images
wikitext
text/x-wiki
<div style="height:50%;"><div style="width:50%;">Vikidia<br />encyclopédie par et pour les enfants[[Fichier:Vikidia 2015-04-20.png|none]]</div><div style="left:50%; width:50%;">Ekopédia<br />savoir-faire en écologie[[Fichier:Ékopédia 2015-04-20.png|none]]</div></div>
<div style="height:50%;"><div style="width:50%;">Wookieepedia<br />univers Star Wars[[Fichier:Wookieepedia 2015-04-20.png|none]]</div><div style="left:50%; width:50%;">OWASP<br />sécurité informatique[[Fichier:OWASP 2015-04-20.png|none]]</div></div>
{{Présentation|Autres exemples de wikis : bases de connaissances thématiques}}
b57de2a68e80ad45398c585d654bf95cb73b2b31
331
330
2015-04-20T14:39:27Z
Seb35
1
tailles
wikitext
text/x-wiki
<div style="height:50%;"><div style="width:50%;">Vikidia<br />encyclopédie par et pour les enfants[[Fichier:Vikidia 2015-04-20.png|none|200px]]</div><div style="left:50%; width:50%;">Ekopédia<br />savoir-faire en écologie[[Fichier:Ékopédia 2015-04-20.png|none|200px]]</div></div>
<div style="height:50%;"><div style="width:50%;">Wookieepedia<br />univers Star Wars[[Fichier:Wookieepedia 2015-04-20.png|none|200px]]</div><div style="left:50%; width:50%;">OWASP<br />sécurité informatique[[Fichier:OWASP 2015-04-20.png|none|200px]]</div></div>
{{Présentation|Autres exemples de wikis : bases de connaissances thématiques}}
94f4de8b967888b13251a5a8e19435ec9d0ba3db
332
331
2015-04-20T14:44:23Z
Seb35
1
wikitext
text/x-wiki
<div style="height:50%;"><div style="width:50%; display:inline-table;">Vikidia<br />encyclopédie par et pour les enfants[[Fichier:Vikidia 2015-04-20.png|none|300px]]</div><div style="width:50%; display:inline-table;">Ekopédia<br />savoir-faire en écologie[[Fichier:Ékopédia 2015-04-20.png|none|300px]]</div></div>
<div style="height:50%;"><div style="width:50%; display:inline-table;">Wookieepedia<br />univers Star Wars[[Fichier:Wookieepedia 2015-04-20.png|none|300px]]</div><div style="width:50%; display:inline-table;">OWASP<br />sécurité informatique[[Fichier:OWASP 2015-04-20.png|none|300px]]</div></div>
{{Présentation|Autres exemples de wikis : bases de connaissances thématiques}}
9a5fec22298ea2bf0bf38118f5a24a431a4ddd96
333
332
2015-04-20T14:49:07Z
Seb35
1
wikitext
text/x-wiki
<div style="height:50%;"><div style="width:50%; display:inline-table;">Vikidia<br />encyclopédie par et pour les enfants[[Fichier:Vikidia 2015-04-20.png|none|center|350px]]</div><div style="width:50%; display:inline-table;">Ekopédia<br />savoir-faire en écologie[[Fichier:Ékopédia 2015-04-20.png|none|center|350px]]</div></div>
<div style="height:50%;"><div style="width:50%; display:inline-table;">Wookieepedia<br />univers Star Wars[[Fichier:Wookieepedia 2015-04-20.png|none|center|350px]]</div><div style="width:50%; display:inline-table;">OWASP<br />sécurité informatique[[Fichier:OWASP 2015-04-20.png|none|center|350px]]</div></div>
{{Présentation|Autres exemples de wikis : bases de connaissances thématiques}}
c65acded1eaad9e1a3f2fbfa335ae6f036acca60
334
333
2015-04-20T14:50:06Z
Seb35
1
wikitext
text/x-wiki
<div style="height:50%;"><div style="width:50%; display:inline-table;">Vikidia<br />encyclopédie par et pour les enfants[[Fichier:Vikidia 2015-04-20.png|center|350px]]</div><div style="width:50%; display:inline-table;">Ekopédia<br />savoir-faire en écologie[[Fichier:Ékopédia 2015-04-20.png|center|350px]]</div></div>
<div style="height:50%;"><div style="width:50%; display:inline-table;">Wookieepedia<br />univers Star Wars[[Fichier:Wookieepedia 2015-04-20.png|center|350px]]</div><div style="width:50%; display:inline-table;">OWASP<br />sécurité informatique[[Fichier:OWASP 2015-04-20.png|center|350px]]</div></div>
{{Présentation|Autres exemples de wikis : bases de connaissances thématiques}}
dff655d9d181a7b2d85070f3b82e6f3b2139611b
335
334
2015-04-20T14:55:57Z
Seb35
1
mise en page, +liens
wikitext
text/x-wiki
<div style="height:50%; text-align:center;"><div style="width:50%; display:inline-table;">[https://fr.vikidia.org/ Vikidia]<br />encyclopédie par et pour les enfants[[Fichier:Vikidia 2015-04-20.png|center|350px]]</div><div style="width:50%; display:inline-table;">[http://fr.ekopedia.org/ Ékopédia]<br />savoir-faire en écologie[[Fichier:Ékopédia 2015-04-20.png|center|350px]]</div></div>
<div style="height:50%; text-align:center;"><div style="width:50%; display:inline-table;">[http://starwars.wikia.com/ Wookieepedia]<br />univers Star Wars[[Fichier:Wookieepedia 2015-04-20.png|center|350px]]</div><div style="width:50%; display:inline-table;">[https://www.owasp.org/ OWASP]<br />sécurité informatique[[Fichier:OWASP 2015-04-20.png|center|350px]]</div></div>
{{Présentation|Autres exemples de wikis : bases de connaissances thématiques}}
7033fa1473aa73999d5197879c1a40eb58d900b5
350
335
2015-04-20T15:53:39Z
Seb35
1
wikitexte plus lisible
wikitext
text/x-wiki
{{Ligne présentation|2|2|css=text-align:center;
| [https://fr.vikidia.org/ Vikidia] <br /> encyclopédie par et pour les enfants
[[Fichier:Vikidia 2015-04-20.png|center|350px]]
| [http://fr.ekopedia.org/ Ékopédia] <br /> savoir-faire en écologie
[[Fichier:Ékopédia 2015-04-20.png|center|350px]]
}}
{{Ligne présentation|2|2|css=text-align:center;
| [http://starwars.wikia.com/ Wookieepedia] <br /> univers Star Wars
[[Fichier:Wookieepedia 2015-04-20.png|center|350px]]
| [https://www.owasp.org/ OWASP] <br /> sécurité informatique
[[Fichier:OWASP 2015-04-20.png|center|350px]]
}}
{{Présentation|Autres exemples de wikis : bases de connaissances thématiques}}
447a126398aa3c7d5f81420636299b65707118f1
Fichier:Meta-Wiki 2015-04-20.png
6
117
336
2015-04-20T15:16:10Z
Seb35
1
Utilisation pour illustration de [[Présentation:Wikis]]. Possiblement des éléments sont sous droit d’auteur.
Page originale : https://meta.wikimedia.org/
wikitext
text/x-wiki
Utilisation pour illustration de [[Présentation:Wikis]]. Possiblement des éléments sont sous droit d’auteur.
Page originale : https://meta.wikimedia.org/
c9995c4ea86b19040e6945f72784cb8fb3f1c719
Fichier:Wikimembres WMFR 2015-04-20.png
6
118
338
2015-04-20T15:17:49Z
Seb35
1
Utilisation pour illustration de [[Présentation:Wikis]]. Possiblement des éléments sont sous droit d’auteur.
Page originale : https://membres.wikimedia.fr/
wikitext
text/x-wiki
Utilisation pour illustration de [[Présentation:Wikis]]. Possiblement des éléments sont sous droit d’auteur.
Page originale : https://membres.wikimedia.fr/
7e49c1afd0ee7a45c8ba47f46d72c142ba887389
Fichier:OSM-Wiki 2015-04-20.png
6
119
342
2015-04-20T15:21:31Z
Seb35
1
Utilisation pour illustration de [[Présentation:Wikis]]. Possiblement des éléments sont sous droit d’auteur.
Page originale : https://wiki.openstreetmap.org/
wikitext
text/x-wiki
Utilisation pour illustration de [[Présentation:Wikis]]. Possiblement des éléments sont sous droit d’auteur.
Page originale : https://wiki.openstreetmap.org/
4de8dc30637113c4c715c89efb833d8cf0b91197
Fichier:Breizh-Entropy wiki 2015-04-20.png
6
120
343
2015-04-20T15:24:22Z
Seb35
1
Utilisation pour illustration de [[Présentation:Wikis]]. Possiblement des éléments sont sous droit d’auteur.
Page originale : http://wiki.breizh-entropy.org/
wikitext
text/x-wiki
Utilisation pour illustration de [[Présentation:Wikis]]. Possiblement des éléments sont sous droit d’auteur.
Page originale : http://wiki.breizh-entropy.org/
4574aef5866fcb561264929559276a1f67d99d9f
Présentation:Wikis/1/4/2
104
107
344
282
2015-04-20T15:27:05Z
Seb35
1
+contenu
wikitext
text/x-wiki
<div style="height:50%; text-align:center;"><div style="width:50%; display:inline-table;">[https://meta.wikimedia.org/ Meta-Wiki]<br />organisation des projets Wikimedia[[Fichier:Meta-Wiki 2015-04-20.png|center|350px]]</div><div style="width:50%; display:inline-table;">[https://membres.wikimedia.fr/ Wiki membres de Wikimédia France]<br />organisation de projets et événements de Wikimédia France[[Fichier:Wikimembres WMFR 2015-04-20.png|center|350px]]</div></div>
<div style="height:50%; text-align:center;"><div style="width:50%; display:inline-table;">[http://wiki.openstreetmap.org/ Wiki OpenStreetMap]<br />documentation et événements autour de OpenStreetMap[[Fichier:OSM-Wiki 2015-04-20.png|center|350px]]</div><div style="width:50%; display:inline-table;">[http://wiki.breizh-entropy.org/ Wiki de Breizh-Entropy]<br />coordination du hackerspace Breizh-Entropy[[Fichier:Breizh-Entropy wiki 2015-04-20.png|center|350px]]</div></div>
{{Présentation|Autres exemples de wikis : wikis de travail}}
dd7d0891d0dc8b7ce086610065c25baf7832230f
346
344
2015-04-20T15:45:08Z
Seb35
1
simplification code
wikitext
text/x-wiki
{{Ligne présentation|2|2|css=text-align:center;
|[https://meta.wikimedia.org/ Meta-Wiki]<br />organisation des projets Wikimedia[[Fichier:Meta-Wiki 2015-04-20.png|center|350px]]
|[https://membres.wikimedia.fr/ Wiki membres de Wikimédia France]<br />organisation de projets et événements de Wikimédia France[[Fichier:Wikimembres WMFR 2015-04-20.png|center|350px]]
}}
{{Ligne présentation|2|2|css=text-align:center;
|[http://wiki.openstreetmap.org/ Wiki OpenStreetMap]<br />documentation et événements autour de OpenStreetMap[[Fichier:OSM-Wiki 2015-04-20.png|center|350px]]
|[http://wiki.breizh-entropy.org/ Wiki de Breizh-Entropy]<br />coordination du hackerspace Breizh-Entropy[[Fichier:Breizh-Entropy wiki 2015-04-20.png|center|350px]]
}}
{{Présentation|Autres exemples de wikis : wikis de travail}}
421fac7fbabfbcede7ce0c764cc31a3300361005
349
346
2015-04-20T15:51:19Z
Seb35
1
présentation du wikitexte
wikitext
text/x-wiki
{{Ligne présentation|2|2|css=text-align:center;
| [https://meta.wikimedia.org/ Meta-Wiki] <br /> organisation des projets Wikimedia
[[Fichier:Meta-Wiki 2015-04-20.png|center|350px]]
| [https://membres.wikimedia.fr/ Wiki membres de Wikimédia France] <br /> organisation de projets et événements de Wikimédia France
[[Fichier:Wikimembres WMFR 2015-04-20.png|center|350px]]
}}
{{Ligne présentation|2|2|css=text-align:center;
| [http://wiki.openstreetmap.org/ Wiki OpenStreetMap] <br /> documentation et événements autour de OpenStreetMap
[[Fichier:OSM-Wiki 2015-04-20.png|center|350px]]
| [http://wiki.breizh-entropy.org/ Wiki de Breizh-Entropy] <br /> coordination du hackerspace Breizh-Entropy
[[Fichier:Breizh-Entropy wiki 2015-04-20.png|center|350px]]
}}
{{Présentation|Autres exemples de wikis : wikis de travail}}
bd45b48d4fbadd1410f0ef89015cecfeab4342ec
Modèle:Ligne présentation
10
121
345
2015-04-20T15:42:20Z
Seb35
1
pour simplification des mises en page des présentations
wikitext
text/x-wiki
<div style="height:{{#expr:100/{{{1}}}}}%;{{#if:{{{css|}}}|{{{css}}};}}">{{#ifexpr:{{{2}}}>=1|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{3}}}</div>}}{{#ifexpr:{{{2}}}>=2|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{4}}}</div>}}{{#ifexpr:{{{2}}}>=3|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{5}}}</div>}}{{#ifexpr:{{{2}}}>=4|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{6}}}</div>}}{{#ifexpr:{{{2}}}>=5|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{7}}}</div>}}{{#ifexpr:{{{2}}}>=6|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{8}}}</div>}}{{#ifexpr:{{{2}}}>=7|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{9}}}</div>}}{{#ifexpr:{{{2}}}>=8|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{10}}}</div>}}{{#ifexpr:{{{2}}}>=9|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{11}}}</div>}}{{#ifexpr:{{{2}}}>=10|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{12}}}</div>}}{{#ifexpr:{{{2}}}>=11|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{13}}}</div>}}{{#ifexpr:{{{2}}}>=12|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{14}}}</div>}}{{#ifexpr:{{{2}}}>=13|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{15}}}</div>}}{{#ifexpr:{{{2}}}>=14|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{16}}}</div>}}{{#ifexpr:{{{2}}}>=15|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{17}}}</div>}}{{#ifexpr:{{{2}}}>=16|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{18}}}</div>}}{{#ifexpr:{{{2}}}>=17|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{19}}}</div>}}{{#ifexpr:{{{2}}}>=18|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{20}}}</div>}}{{#ifexpr:{{{2}}}>=19|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{21}}}</div>}}{{#ifexpr:{{{2}}}>=20|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{22}}}</div>}}</div>
a7665d94ada38aea2b0c4ac3927a59b2f7e21fe9
347
345
2015-04-20T15:46:16Z
Seb35
1
typo
wikitext
text/x-wiki
<div style="height:{{#expr:100/{{{1}}}}}%;{{#if:{{{css|}}}|{{{css}}}}}">{{#ifexpr:{{{2}}}>=1|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{3}}}</div>}}{{#ifexpr:{{{2}}}>=2|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{4}}}</div>}}{{#ifexpr:{{{2}}}>=3|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{5}}}</div>}}{{#ifexpr:{{{2}}}>=4|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{6}}}</div>}}{{#ifexpr:{{{2}}}>=5|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{7}}}</div>}}{{#ifexpr:{{{2}}}>=6|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{8}}}</div>}}{{#ifexpr:{{{2}}}>=7|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{9}}}</div>}}{{#ifexpr:{{{2}}}>=8|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{10}}}</div>}}{{#ifexpr:{{{2}}}>=9|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{11}}}</div>}}{{#ifexpr:{{{2}}}>=10|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{12}}}</div>}}{{#ifexpr:{{{2}}}>=11|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{13}}}</div>}}{{#ifexpr:{{{2}}}>=12|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{14}}}</div>}}{{#ifexpr:{{{2}}}>=13|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{15}}}</div>}}{{#ifexpr:{{{2}}}>=14|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{16}}}</div>}}{{#ifexpr:{{{2}}}>=15|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{17}}}</div>}}{{#ifexpr:{{{2}}}>=16|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{18}}}</div>}}{{#ifexpr:{{{2}}}>=17|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{19}}}</div>}}{{#ifexpr:{{{2}}}>=18|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{20}}}</div>}}{{#ifexpr:{{{2}}}>=19|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{21}}}</div>}}{{#ifexpr:{{{2}}}>=20|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{22}}}</div>}}</div>
22f97511aa9f4b2bcba3a74b5df4a1bcea5977a8
348
347
2015-04-20T15:46:54Z
Seb35
1
ça ne sert à rien d’afficher le modèle ici
wikitext
text/x-wiki
<includeonly><div style="height:{{#expr:100/{{{1}}}}}%;{{#if:{{{css|}}}|{{{css}}}}}">{{#ifexpr:{{{2}}}>=1|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{3}}}</div>}}{{#ifexpr:{{{2}}}>=2|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{4}}}</div>}}{{#ifexpr:{{{2}}}>=3|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{5}}}</div>}}{{#ifexpr:{{{2}}}>=4|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{6}}}</div>}}{{#ifexpr:{{{2}}}>=5|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{7}}}</div>}}{{#ifexpr:{{{2}}}>=6|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{8}}}</div>}}{{#ifexpr:{{{2}}}>=7|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{9}}}</div>}}{{#ifexpr:{{{2}}}>=8|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{10}}}</div>}}{{#ifexpr:{{{2}}}>=9|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{11}}}</div>}}{{#ifexpr:{{{2}}}>=10|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{12}}}</div>}}{{#ifexpr:{{{2}}}>=11|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{13}}}</div>}}{{#ifexpr:{{{2}}}>=12|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{14}}}</div>}}{{#ifexpr:{{{2}}}>=13|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{15}}}</div>}}{{#ifexpr:{{{2}}}>=14|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{16}}}</div>}}{{#ifexpr:{{{2}}}>=15|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{17}}}</div>}}{{#ifexpr:{{{2}}}>=16|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{18}}}</div>}}{{#ifexpr:{{{2}}}>=17|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{19}}}</div>}}{{#ifexpr:{{{2}}}>=18|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{20}}}</div>}}{{#ifexpr:{{{2}}}>=19|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{21}}}</div>}}{{#ifexpr:{{{2}}}>=20|<div style="width:{{#expr:100/{{{2}}}}}%; display:inline-table;">{{{22}}}</div>}}</div></includeonly>
9eedc450f984d4c484fd461659415918038f12bd
359
348
2015-04-20T19:44:44Z
Seb35
1
paramètres par défaut
wikitext
text/x-wiki
<includeonly><div style="height:{{#expr:100/{{{1|1}}}}}%;{{#if:{{{css|}}}|{{{css}}}}}">{{#ifexpr:{{{2|1}}}>=1|<div style="width:{{#expr:100/{{{2|1}}}}}%; display:inline-table;">{{{3|}}}</div>}}{{#ifexpr:{{{2|1}}}>=2|<div style="width:{{#expr:100/{{{2|1}}}}}%; display:inline-table;">{{{4|}}}</div>}}{{#ifexpr:{{{2|1}}}>=3|<div style="width:{{#expr:100/{{{2|1}}}}}%; display:inline-table;">{{{5|}}}</div>}}{{#ifexpr:{{{2|1}}}>=4|<div style="width:{{#expr:100/{{{2|1}}}}}%; display:inline-table;">{{{6|}}}</div>}}{{#ifexpr:{{{2|1}}}>=5|<div style="width:{{#expr:100/{{{2|1}}}}}%; display:inline-table;">{{{7|}}}</div>}}{{#ifexpr:{{{2|1}}}>=6|<div style="width:{{#expr:100/{{{2|1}}}}}%; display:inline-table;">{{{8|}}}</div>}}{{#ifexpr:{{{2|1}}}>=7|<div style="width:{{#expr:100/{{{2|1}}}}}%; display:inline-table;">{{{9|}}}</div>}}{{#ifexpr:{{{2|1}}}>=8|<div style="width:{{#expr:100/{{{2|1}}}}}%; display:inline-table;">{{{10|}}}</div>}}{{#ifexpr:{{{2|1}}}>=9|<div style="width:{{#expr:100/{{{2|1}}}}}%; display:inline-table;">{{{11|}}}</div>}}{{#ifexpr:{{{2|1}}}>=10|<div style="width:{{#expr:100/{{{2|1}}}}}%; display:inline-table;">{{{12|}}}</div>}}{{#ifexpr:{{{2|1}}}>=11|<div style="width:{{#expr:100/{{{2|1}}}}}%; display:inline-table;">{{{13|}}}</div>}}{{#ifexpr:{{{2|1}}}>=12|<div style="width:{{#expr:100/{{{2|1}}}}}%; display:inline-table;">{{{14|}}}</div>}}{{#ifexpr:{{{2|1}}}>=13|<div style="width:{{#expr:100/{{{2|1}}}}}%; display:inline-table;">{{{15|}}}</div>}}{{#ifexpr:{{{2|1}}}>=14|<div style="width:{{#expr:100/{{{2|1}}}}}%; display:inline-table;">{{{16|}}}</div>}}{{#ifexpr:{{{2|1}}}>=15|<div style="width:{{#expr:100/{{{2|1}}}}}%; display:inline-table;">{{{17|}}}</div>}}{{#ifexpr:{{{2|1}}}>=16|<div style="width:{{#expr:100/{{{2|1}}}}}%; display:inline-table;">{{{18|}}}</div>}}{{#ifexpr:{{{2|1}}}>=17|<div style="width:{{#expr:100/{{{2|1}}}}}%; display:inline-table;">{{{19|}}}</div>}}{{#ifexpr:{{{2|1}}}>=18|<div style="width:{{#expr:100/{{{2|1}}}}}%; display:inline-table;">{{{20|}}}</div>}}{{#ifexpr:{{{2|1}}}>=19|<div style="width:{{#expr:100/{{{2|1}}}}}%; display:inline-table;">{{{21|}}}</div>}}{{#ifexpr:{{{2|1}}}>=20|<div style="width:{{#expr:100/{{{2|1}}}}}%; display:inline-table;">{{{22|}}}</div>}}</div></includeonly>
0413783417cf5a726a399346248d0d0c31f059e2
Présentation:Wikis/1/5
104
122
351
2015-04-20T18:38:22Z
Seb35
1
++
wikitext
text/x-wiki
* [[:frwikipedia:Licence libre|Licences libres]]
** Équation fondamentale : libre ≠ [[:frwikipedia:Freeware|gratuit]]
** Contrats spécifiques accordant des droits à l’utilisateur
** [[:frwikipedia:Licence de libre diffusion|Licences de libre diffusion]] : [[:frwikipedia:Creative Commons|Creative Commons]] [[:frwikipedia:Licence Creative Commons#Pas d'utilisation commerciale|CC-*-NC]] et [[:frwikipedia:Licence Creative Commons#Pas de travaux dérivés|CC-*-ND]]
** [[:frwikipedia:Copyleft|Licences ''copyleft'']] : [[:frwikipedia:Creative Commons|Creative Commons]] [https://creativecommons.org/licenses/by-sa/4.0/ CC-BY-SA], [[:frwikipedia:Licence publique générale GNU|GPL]], [[:frwikipedia:Licence Art Libre|Art Libre]]
** Licences non-''copyleft'' : [[:frwikipedia:Creative Commons|Creative Commons]] [[:frwikipedia:Creative Commons Attribution|CC-BY]] et [[:frwikipedia:Licence CC0|CC0]], [[:frwikipedia:Licence BSD|BSD]], [[:frwikipedia:Licence publique générale limitée GNU|LGPL]]
* Droits connexes rencontrés autour des wikis : [[:frwikipedia:Droits voisins du droit d'auteur en France|droits voisins]], [[:frwikipedia:Droit à l'image|droit à l’image]], [[:frwikipedia:Protection juridique des bases de données|droit des bases de données]]
{{Présentation|Questions juridiques}}
8f377bcddc1fdd9f78290dc16702462200f0731a
352
351
2015-04-20T19:08:27Z
Seb35
1
++
wikitext
text/x-wiki
* [[:frwikipedia:Licence libre|Licences libres]]
** Équation fondamentale : libre ≠ [[:frwikipedia:Freeware|gratuit]]
** Contrats spécifiques accordant des droits à l’utilisateur
** [[:frwikipedia:Licence de libre diffusion|Licences de libre diffusion]] : [[:frwikipedia:Creative Commons|Creative Commons]] [[:frwikipedia:Licence Creative Commons#Pas d'utilisation commerciale|CC-*-NC]] et [[:frwikipedia:Licence Creative Commons#Pas de travaux dérivés|CC-*-ND]]
** [[:frwikipedia:Copyleft|Licences ''copyleft'']] : [[:frwikipedia:Creative Commons|Creative Commons]] [https://creativecommons.org/licenses/by-sa/4.0/ CC-BY-SA], [[:frwikipedia:Licence publique générale GNU|GPL]], [[:frwikipedia:Licence Art Libre|Art Libre]]
** Licences non-''copyleft'' : [[:frwikipedia:Creative Commons|Creative Commons]] [[:frwikipedia:Creative Commons Attribution|CC-BY]] et [[:frwikipedia:Licence CC0|CC0]], [[:frwikipedia:Licence BSD|BSD]], [[:frwikipedia:Licence publique générale limitée GNU|LGPL]]
* Droits connexes rencontrés autour des wikis : [[:frwikipedia:Droits voisins du droit d'auteur en France|droits voisins]], [[:frwikipedia:Droit à l'image|droit à l’image]], [[:frwikipedia:Protection juridique des bases de données|droit des bases de données]]
* Questions sous-jacentes aux licences libres :
** Économiques : rémunération des auteurs, [[:frwikipedia:Économie de l'immatériel|économie de l’immatériel]]
** Morales : propriété de l’immatériel, respect
** Philosophiques : [[:frwikipedia:Bien immatériel|biens immatériels]]/[[:frwikipedia:Biens anti-rivaux|biens anti-rivaux]], [[:frwikipedia:Cocréation|co-création]]/[[:frwikipedia:Intelligence collaborative|intelligence collaborative]]/''[[:frwikipedia:Wikinomics|wikinomics]]''
{{Présentation|Questions juridiques}}
bab5a8c918a11b9d6b4d88cce7a340d2796f9a03
354
352
2015-04-20T19:24:52Z
Seb35
1
++
wikitext
text/x-wiki
* [[:frwikipedia:Licence libre|Licences libres]]
** Équation fondamentale : libre ≠ [[:frwikipedia:Freeware|gratuit]]
** Contrats spécifiques accordant des droits à l’utilisateur
** [[:frwikipedia:Licence de libre diffusion|Licences de libre diffusion]] : [[:frwikipedia:Creative Commons|Creative Commons]] [[:frwikipedia:Licence Creative Commons#Pas d'utilisation commerciale|CC-*-NC]] et [[:frwikipedia:Licence Creative Commons#Pas de travaux dérivés|CC-*-ND]]
** [[:frwikipedia:Copyleft|Licences ''copyleft'']] : [[:frwikipedia:Creative Commons|Creative Commons]] [https://creativecommons.org/licenses/by-sa/4.0/ CC-BY-SA], [[:frwikipedia:Licence publique générale GNU|GPL]], [[:frwikipedia:Licence Art Libre|Art Libre]]
** Licences non-''copyleft'' : [[:frwikipedia:Creative Commons|Creative Commons]] [[:frwikipedia:Creative Commons Attribution|CC-BY]] et [[:frwikipedia:Licence CC0|CC0]], [[:frwikipedia:Licence BSD|BSD]], [[:frwikipedia:Licence publique générale limitée GNU|LGPL]]
* Droits connexes rencontrés autour des wikis : [[:frwikipedia:Droits voisins du droit d'auteur en France|droits voisins]], [[:frwikipedia:Droit à l'image|droit à l’image]], [[:frwikipedia:Protection juridique des bases de données|droit des bases de données]], [[:frwikipedia:Vie privée et informatique|vie privée sur l’Internet]]
* Questions sous-jacentes aux licences libres :
** Économiques : rémunération des auteurs, [[:frwikipedia:Économie de l'immatériel|économie de l’immatériel]]
** Morales : propriété de l’immatériel, respect
** Philosophiques : [[:frwikipedia:Bien immatériel|biens immatériels]]/[[:frwikipedia:Biens anti-rivaux|biens anti-rivaux]], [[:frwikipedia:Cocréation|co-création]]/[[:frwikipedia:Intelligence collaborative|intelligence collaborative]]/''[[:frwikipedia:Wikinomics|wikinomics]]''
{{Présentation|Questions juridiques}}
642443ee4bed41f6769ef4a38044d12a127c4c47
Module:Présentation
828
104
353
280
2015-04-20T19:19:43Z
Seb35
1
certains titres étaient oubliés dans la liste (cas 2e elseif,1er if)
wikitext
text/x-wiki
--[[
]]
local presentation = {}
function presentation.total( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
return table.getn( sequence )
end
function presentation.current( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return i
end
end
return 0
end
function presentation.next( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i+1]
end
end
return ''
end
function presentation.previous( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i,v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i-1]
end
end
return ''
end
function presentation._expandSequence( title )
local list = {};
title = title.rootPageTitle;
while true do
if title:subPageTitle( '0' ).exists then
title = title:subPageTitle( '0' )
elseif title:subPageTitle( '1' ).exists then
title = title:subPageTitle( '1' )
elseif tonumber(title.subpageText) ~= nil then
if not title.exists then
if title.baseText == title.rootText then
break
end
title = title.basePageTitle.basePageTitle:subPageTitle( tostring(tonumber(title.basePageTitle.subpageText)+1) )
else
title = title.basePageTitle:subPageTitle( tostring(tonumber(title.subpageText)+1) )
end
else
break
end
if title.exists then
list[table.getn(list)+1] = title.fullText
end
end
return list
end
return presentation
10f9bda926a482f194ebba7134a4ca3bba5d13c0
Présentation:Wikis/2
104
123
356
2015-04-20T19:31:09Z
Seb35
1
++
wikitext
text/x-wiki
Plan :
# Organiser une communauté : théorie et vue d’ensemble
# S’adapter à l’environnement local
# Coocooning : adapter l’outil à ses besoins propres
# Rôles technico-administratifs
493a84f6739c897511e47c2fea6a873fd7a8d437
357
356
2015-04-20T19:32:35Z
Seb35
1
+titre et liens
wikitext
text/x-wiki
Plan :
# [[Présentation:Wikis/2/1|Organiser une communauté : théorie et vue d’ensemble]]
# [[Présentation:Wikis/2/2|S’adapter à l’environnement local]]
# [[Présentation:Wikis/2/3|Coocooning : adapter l’outil à ses besoins propres]]
# [[Présentation:Wikis/2/4|Rôles technico-administratifs]]
{{Présentation|Gérer un wiki MediaWiki}}
4becbcc00b87d0a328147bafefdb8ce467e7feca
Présentation:Wikis/2/1
104
124
360
2015-04-21T12:30:22Z
Seb35
1
++
wikitext
text/x-wiki
* [http://www.anthere.org/post/2012/05/03/Motiver-les-participants-d-un-projet-wiki%3A-l-influence-des-r%C3%B4les Théorie d’Anthere] : plusieurs rôles distincts
** Rôles proposés : créateur-expert, affineur, archiviste, contrôleur-évaluateur, patrouilleur, régulateur-facilitateur, bidouilleur technique, pompier médiateur, agent d’accueil, journaliste
** Possibilité de créer une toile d’araignée d’auto-évaluation dans ces rôles : <tt>http://lab.seb35.fr/participants-wiki.htm</tt> ([http://lab.seb35.fr/participants-wiki.htm#2-2-3-5-1-2-1-1-2-5 exemple])
* Bienveillance et empathie, ticket d’entrée (technique et social)
{{Présentation|Organiser une communauté : théorie et vue d’ensemble}}
979182bd2f2f0334e4cee38d538a487ef10d13d7
Présentation:Wikis/2/2
104
125
361
2015-04-21T13:25:03Z
Seb35
1
++
wikitext
text/x-wiki
* Discussions collectives
** Lieux : pages de discussions, pages par projets/thématiques, lieu central (« Bistro »)
* Règles
** Savoir-vivre
* Récompenses
{{Présentation|S’adapter à l’environnement local}}
4a92cef2415b1afe7c1c15af647edb3a521d513e
Présentation:Wikis/2/3
104
126
362
2015-04-21T13:26:40Z
Seb35
1
++
wikitext
text/x-wiki
* Catégories : organiser et hiérarchiser les pages
* Espaces de noms
* Modèles : unifier les présentations
* Style : personnaliser le style d’un wiki
* Extensions : ajouter des fonctionnalités
{{Présentation|Coocooning : adapter l’outil à ses besoins propres}}
7410b2377df2410108ccc850701fdf4810cb37c5
Présentation:Wikis/2/4
104
127
363
2015-04-21T13:31:52Z
Seb35
1
++
wikitext
text/x-wiki
* administrateur : supprimer et bloquer des pages, bloquer des utilisateurs
* affiner les rôles : donner plus de possibilité d’actions aux utilisateurs de confiance
{{Présentation|Rôles technico-administratifs}}
6875302dcc64a0333d5524b465f813164726eac1
Présentation:Wikis/3
104
128
364
2015-04-21T13:36:50Z
Seb35
1
++
wikitext
text/x-wiki
# [[Présentation:Wikis/3/1|Les bases de la syntaxe]]
# [[Présentation:Wikis/3/2|Les syntaxes avancées]]
# [[Présentation:Wikis/3/3|Gérer le vandalisme]]
# [[Présentation:Wikis/3/4|Gérer les images et médias]]
# [[Présentation:Wikis/3/5|Ressources d’aide]]
{{Présentation|Le quotidien en pratique}}
b29bf2bd73862ec2c8f77fcdb02ee79489578391
Présentation:Wikis/3/1
104
129
365
2015-04-21T13:38:41Z
Seb35
1
++
wikitext
text/x-wiki
* Mise en forme : emphase et liens
* Catégories
* Utilisation de modèles
* Utilisation d’images et médias
{{Présentation|Les bases de la syntaxe}}
6378857f44a4fdc51f08ccf3464267e863848bd7
406
365
2015-04-21T21:53:11Z
Seb35
1
++
wikitext
text/x-wiki
* Syntaxe spécifique appelée ''wikitexte''
* Mise en forme : emphase et liens
** <tt><nowiki>''texte en italique''</nowiki></tt> → ''texte en italique''
** <tt><nowiki>'''texte en gras'''</nowiki></tt> → '''texte en gras''
** <tt><nowiki>[[Présentation:Wikis|Le texte]]</nowiki></tt> → [[Présentation:Wikis|<span style="color:#0645AD">Le texte</span>]]
* Catégories
** <tt><nowiki>[[Catégorie:Nom de la catégorie]]</nowiki></tt> : rien ne s’affiche à cet endroit mais les catégories de l’articles sont affichées en bas de la page (désactivé dans ce mode « présentation »)
* Utilisation de modèles
** <tt><nowiki>{{Bleu|texte}}</nowiki></tt> → {{Bleu|texte}}
* Utilisation d’images et médias
** <tt><nowiki>[[Fichier:Graphe contributeur wiki Seb35.png|none|Titre affiché lorsque la souris passe sur l’image]]</nowiki></tt> → [[Fichier:Graphe contributeur wiki Seb35.png|none|Titre affiché lorsque la souris passe sur l’image]]
** Les images doivent être préalablement importées sur le wiki (lien « [[Special:Upload|Importer un fichier]] » dans la colonne de gauche lorsqu’on est connecté)
{{Présentation|Les bases de la syntaxe}}
daa7707e890624227698f6b1e5b0e4ab6c37d4bd
407
406
2015-04-21T21:54:15Z
Seb35
1
mise en page
wikitext
text/x-wiki
* Syntaxe spécifique appelée ''wikitexte''
* Mise en forme : emphase et liens
** <tt><nowiki>''texte en italique''</nowiki></tt> → ''texte en italique''
** <tt><nowiki>'''texte en gras'''</nowiki></tt> → '''texte en gras''
** <tt><nowiki>[[Présentation:Wikis|Le texte]]</nowiki></tt> → [[Présentation:Wikis|<span style="color:#0645AD">Le texte</span>]]
* Catégories
** <tt><nowiki>[[Catégorie:Nom de la catégorie]]</nowiki></tt> : rien ne s’affiche à cet endroit mais les catégories de l’articles sont affichées en bas de la page (désactivé dans ce mode « présentation »)
* Utilisation de modèles
** <tt><nowiki>{{Bleu|texte}}</nowiki></tt> → {{Bleu|texte}}
* Utilisation d’images et médias
** <tt><nowiki>[[Fichier:Graphe contributeur wiki Seb35.png|none|30px|Titre affiché lorsque la souris passe sur l’image]]</nowiki></tt> → [[Fichier:Graphe contributeur wiki Seb35.png|none|30px|Titre affiché lorsque la souris passe sur l’image]]
** Les images doivent être préalablement importées sur le wiki (lien « [[Special:Upload|Importer un fichier]] » dans la colonne de gauche lorsqu’on est connecté)
{{Présentation|Les bases de la syntaxe}}
e10d02aca1f2beb03095bbae1d175a2e7107dd7f
412
407
2015-04-21T23:10:26Z
Seb35
1
+liens
wikitext
text/x-wiki
* Syntaxe spécifique appelée ''[[:frwikipedia:Wikitexte|wikitexte]]'', de la famille des [[:frwikipedia:Langage de balisage léger|languages de balisage léger]] ([[Syntaxes de formatage léger|comparer]])
* Mise en forme : emphase et liens
** <tt><nowiki>''texte en italique''</nowiki></tt> → ''texte en italique''
** <tt><nowiki>'''texte en gras'''</nowiki></tt> → '''texte en gras''
** <tt><nowiki>[[Présentation:Wikis|Le texte]]</nowiki></tt> → [[Présentation:Wikis|<span style="color:#0645AD">Le texte</span>]]
* Catégories
** <tt><nowiki>[[Catégorie:Nom de la catégorie]]</nowiki></tt> : rien ne s’affiche à cet endroit mais les catégories de l’articles sont affichées en bas de la page (désactivé dans ce mode « présentation »)
* Utilisation de modèles
** <tt><nowiki>{{Bleu|texte}}</nowiki></tt> → {{Bleu|texte}}
* Utilisation d’images et médias
** <tt><nowiki>[[Fichier:Graphe contributeur wiki Seb35.png|none|30px|Titre affiché lorsque la souris passe sur l’image]]</nowiki></tt> → [[Fichier:Graphe contributeur wiki Seb35.png|none|30px|Titre affiché lorsque la souris passe sur l’image]]
** Les images doivent être préalablement importées sur le wiki (lien « [[Special:Upload|Importer un fichier]] » dans la colonne de gauche lorsqu’on est connecté)
{{Présentation|Les bases de la syntaxe}}
72c1b7f278eabb203017272159e37ff9777f4888
Présentation:Wikis/3/2
104
130
366
2015-04-21T13:39:16Z
Seb35
1
++
wikitext
text/x-wiki
* Tableaux
* Création de modèles
{{Présentation|Les syntaxes avancées}}
f83f295a488dfacdef538dd2ad8a8ad6de63222a
411
366
2015-04-21T23:05:12Z
Seb35
1
++
wikitext
text/x-wiki
* Titres : <tt><nowiki>= Titre de niveau 1 =</nowiki></tt> / <tt><nowiki>== Titre de niveau 2 ==</nowiki></tt> / (jusqu’à 6)
* Listes :
** Listes à puces : <span style="display:inline-table; border:1px dotted grey; padding:0.1em;"><tt><nowiki>* Listes :</nowiki><br /><nowiki>** Listes à puces</nowiki><br /><nowiki>*# Listes numérotées</nowiki><br /><nowiki>* Tableaux</nowiki></tt></span>
*# Listes numérotées avec des croisillons (<tt>#</tt>) à la place des astérisques (<tt>*</tt>)
* Tableaux : [[:mw:Help:Tables|syntaxe spécifique]]
* [[:mw:Help:Contents|Quelques autres syntaxes]] moins usitées
* Création de modèles : il est possible de créer des modèles ayant de nombreuses fonctionnalités : adaptabilité en fonction des paramètres donnés, logique interne pouvant être complexe, influence de paramètres extérieurs (page, date, configuration du wiki)
* Import de modèles d’autres wikis : possible « à la main » (en copiant-collant ; pour des questions de licence il est préférable d’indiquer la page source) ; un jour il devrait y avoir une « banque de modèles » dont on pourrait télécharger et installer des modèles
{{Présentation|Les syntaxes avancées}}
7444cc1d0664f2eed57605eec2f3426afcb85ca7
Présentation:Wikis/3/3
104
131
367
2015-04-21T13:39:50Z
Seb35
1
++
wikitext
text/x-wiki
* Surveiller les modifications récentes
* Gérer le spam
* Bloquer des contributeurs
{{Présentation|Gérer le vandalisme}}
ff1a07cdac396d1348aca3dd81ffe0934935703b
410
367
2015-04-21T22:38:42Z
Seb35
1
++
wikitext
text/x-wiki
* Surveiller les modifications récentes
** Possibilité de recevoir un flux [[:frwikipedia:RSS|RSS]]/[[:frwikipedia:Atom|Atom]]
** La plupart des spammeurs aujourd’hui se créent un compte voire valident l’autorisation envoyée par email
** Révoquer les tests et les fragrants délis, prévenir les contravenents de façon proportionnée (un ou plusieurs avertissements, puis blocage temporaire, puis blocage permanent)
** Idéalement plusieurs contributeurs se relaient (pas forcément de façon formelle)
* Gérer le spam
** Bloquer les utilisateurs manifestement spammeurs (pavé de texte en anglais ou russe)
** Une extension, [[:mw:Extension:Nuke|Nuke]], permet de supprimer toutes les contributions d’un utilisateur
* Prévenir le spam
** Extension [[:mw:Extension:QuestyCaptcha|QuestyCaptcha]] (poser une question demandant réflexion) ; si brisé, changer les questions
** Retirer le spam pour ne pas encourager les spammeurs
** Faire que la communauté ait les moyens de traiter efficacement le spam
{{Présentation|Gérer le vandalisme}}
329c56f78f324ae2c7886f186d6e442c6459a5c9
Présentation:Wikis/3/4
104
132
368
2015-04-21T13:40:20Z
Seb35
1
++
wikitext
text/x-wiki
* Verser une image ou un média
* Questions de licences
{{Présentation|Gérer les images et médias}}
f21b132469ca607a0036e26352edfd9eb18bda9d
413
368
2015-04-22T05:57:09Z
Seb35
1
++
wikitext
text/x-wiki
* Verser une image ou un média
** Deux interfaces : [[Special:Upload|standard]] et [[:mw:Extension:UploadWizard|simplifiée]]
** Autres : import transparent d’un autre wiki, versement depuis Internet
* Rangement des images
** Possibilité de classer les images par catégories, de façon automatique via des modèles ou manuellement
** Possibilité de créer un [[:commons:Template:Information|modèle standard de description des images]]
* Questions de licences
** L’interface de versement peut proposer un [[:commons:MediaWiki:Licenses|choix de licenses]]
{{Présentation|Gérer les images et médias}}
d599d2f8e38e5fc606f895f79a66770f733a4365
414
413
2015-04-22T05:57:58Z
Seb35
1
typo
wikitext
text/x-wiki
* Verser une image ou un média
** Deux interfaces : [[Special:Upload|standard]] et [[:mw:Extension:UploadWizard|améliorée]]
** Autres : import transparent d’un autre wiki, versement depuis Internet
* Rangement des images
** Possibilité de classer les images par catégories, de façon automatique via des modèles ou manuellement
** Possibilité de créer un [[:commons:Template:Information|modèle standard de description des images]]
* Questions de licences
** L’interface de versement peut proposer un [[:commons:MediaWiki:Licenses|choix de licenses]]
{{Présentation|Gérer les images et médias}}
5949c505bebeecfce8abb193e1fdb9c9ad9eed04
Présentation:Wikis/5/1
104
133
369
2015-04-21T13:40:53Z
Seb35
1
++
wikitext
text/x-wiki
* Verser une image ou un média
* Questions de licences
{{Présentation|Gérer les images et médias}}
f21b132469ca607a0036e26352edfd9eb18bda9d
Présentation:Wikis/4
104
134
370
2015-04-21T13:42:13Z
Seb35
1
++
wikitext
text/x-wiki
# Syntaxe et médias
# Licences et philosophie
# Faire découvrir l’ensemble des rôles
# Présentations collectives
{{Présentation|Accompagner des utilisateurs}}
90177ed5d3ea40251c8b644aad7c63d273fa4e45
371
370
2015-04-21T13:43:15Z
Seb35
1
++
wikitext
text/x-wiki
# [[Présentation:Wikis/5/1|Syntaxe et médias]]
# [[Présentation:Wikis/5/2|Licences et philosophie]]
# [[Présentation:Wikis/5/3|Faire découvrir l’ensemble des rôles]]
# [[Présentation:Wikis/5/4|Présentations collectives]]
{{Présentation|Accompagner des utilisateurs}}
2ddac6f9a97e3dcc79c94a6477626334f29bbf59
382
371
2015-04-21T13:54:53Z
Seb35
1
numéros
wikitext
text/x-wiki
# [[Présentation:Wikis/4/1|Syntaxe et médias]]
# [[Présentation:Wikis/4/2|Licences et philosophie]]
# [[Présentation:Wikis/4/3|Faire découvrir l’ensemble des rôles]]
# [[Présentation:Wikis/4/4|Présentations collectives]]
{{Présentation|Accompagner des utilisateurs}}
1d445faffa9f015414ed003c05a301c3df9d834f
392
382
2015-04-21T18:24:26Z
Seb35
1
+modèle présentation plan
wikitext
text/x-wiki
{{Présentation plan|
# [[Présentation:Wikis/4/1|Syntaxe et médias]]
# [[Présentation:Wikis/4/2|Licences et philosophie]]
# [[Présentation:Wikis/4/3|Faire découvrir l’ensemble des rôles]]
# [[Présentation:Wikis/4/4|Présentations collectives]]
}}
{{Présentation|Accompagner des utilisateurs}}
e7f1bfe8e46a32feef9862743a74e358ef4da77c
Présentation:Wikis/4/2
104
135
372
2015-04-21T13:44:22Z
Seb35
1
++
wikitext
text/x-wiki
* Faire manipuler la syntaxe
* Montrer comment verser un média et comment l’inclure dans une page
{{Présentation|Syntaxe et médias}}
eeed97f27ee866373cd4572eff306a650373d623
378
372
2015-04-21T13:53:00Z
Seb35
1
Seb35 a déplacé la page [[Présentation:Wikis/5/1]] vers [[Présentation:Wikis/4/1]] sans laisser de redirection : erreur de numérotation
wikitext
text/x-wiki
* Faire manipuler la syntaxe
* Montrer comment verser un média et comment l’inclure dans une page
{{Présentation|Syntaxe et médias}}
eeed97f27ee866373cd4572eff306a650373d623
Présentation:Wikis/4/1
104
136
373
2015-04-21T13:44:56Z
Seb35
1
++
wikitext
text/x-wiki
* Philosophie du partage
* Paternité/maternité des œuvres
{{Présentation|Licences et philosophie}}
b1fba51c81df3d32ccf9c1a3ba640f7143216e01
379
373
2015-04-21T13:53:24Z
Seb35
1
Seb35 a déplacé la page [[Présentation:Wikis/5/2]] vers [[Présentation:Wikis/4/2]] sans laisser de redirection : erreur de numérotation
wikitext
text/x-wiki
* Philosophie du partage
* Paternité/maternité des œuvres
{{Présentation|Licences et philosophie}}
b1fba51c81df3d32ccf9c1a3ba640f7143216e01
Présentation:Wikis/4/3
104
137
374
2015-04-21T13:45:25Z
Seb35
1
++
wikitext
text/x-wiki
* Évoquer les rôles autres que contributeur-expert vers lesquels évoluer
{{Présentation|Faire découvrir l’ensemble des rôles}}
624b5265b3e119433af2a473167cdc330cac2497
380
374
2015-04-21T13:54:07Z
Seb35
1
Seb35 a déplacé la page [[Présentation:Wikis/5/3]] vers [[Présentation:Wikis/4/3]] sans laisser de redirection : erreur de numérotation
wikitext
text/x-wiki
* Évoquer les rôles autres que contributeur-expert vers lesquels évoluer
{{Présentation|Faire découvrir l’ensemble des rôles}}
624b5265b3e119433af2a473167cdc330cac2497
Présentation:Wikis/4/4
104
138
375
2015-04-21T13:45:52Z
Seb35
1
++
wikitext
text/x-wiki
* Présenter la philosophie des wikis et le rôle de ce wiki spécifique
* Montrer quelques articles
* Désinhiber de la contribution
** ne pas avoir peur des erreurs, toujours corrigeables
** bienveillance des autres contributeurs, accueil bienveillant
** faire manipuler la syntaxe et la contribution
{{Présentation|Présentations collectives}}
f4774e18dc0a61536b9cf16a285f3a01a7839923
381
375
2015-04-21T13:54:34Z
Seb35
1
Seb35 a déplacé la page [[Présentation:Wikis/5/4]] vers [[Présentation:Wikis/4/4]] sans laisser de redirection : erreur de numérotation
wikitext
text/x-wiki
* Présenter la philosophie des wikis et le rôle de ce wiki spécifique
* Montrer quelques articles
* Désinhiber de la contribution
** ne pas avoir peur des erreurs, toujours corrigeables
** bienveillance des autres contributeurs, accueil bienveillant
** faire manipuler la syntaxe et la contribution
{{Présentation|Présentations collectives}}
f4774e18dc0a61536b9cf16a285f3a01a7839923
Présentation:Wikis/5/2
104
139
376
2015-04-21T13:47:41Z
Seb35
1
++
wikitext
text/x-wiki
Questions ?
{{Présentation|Questions libres}}
95aec2b535e268e6c3ac73429b36af36fc07e396
377
376
2015-04-21T13:51:53Z
Seb35
1
Seb35 a déplacé la page [[Présentation:Wikis/6]] vers [[Présentation:Wikis/5]] sans laisser de redirection : erreur de numérotation
wikitext
text/x-wiki
Questions ?
{{Présentation|Questions libres}}
95aec2b535e268e6c3ac73429b36af36fc07e396
405
377
2015-04-21T21:44:06Z
Seb35
1
+crédits
wikitext
text/x-wiki
{{Ligne présentation|4}}
{{Ligne présentation|4|1|
Questions ?
}}
{{Ligne présentation|4|1|
Crédits :
* Textes : [https://www.seb35.fr/ Seb35], sous licence [http://www.wtfpl.net/ WTFPL 2.0]
* Images : voir le détail pour chacune en cliquant soit sur l’image elle-même soit sur la petite icône en bas à droite du cadre de l’image
}}
{{Présentation|Questions libres}}
3ed1396ca30a65184ce53d9da852ee89ee330d3c
408
405
2015-04-21T21:56:53Z
Seb35
1
mise en page
wikitext
text/x-wiki
{{Ligne présentation|4}}
{{Ligne présentation|4|1|
<span style="margin-left:10em; font-size:4em">Questions ?</span>
}}
{{Ligne présentation|4}}
{{Ligne présentation|4|1|
Crédits :
* Textes : [https://www.seb35.fr/ Seb35], sous licence [http://www.wtfpl.net/ WTFPL 2.0]
* Images : voir le détail pour chacune en cliquant soit sur l’image elle-même soit sur la petite icône en bas à droite du cadre de l’image
}}
{{Présentation|Questions libres}}
455a5810e9c62aeaf4f686a46984284b0c5882c5
409
408
2015-04-21T21:59:51Z
Seb35
1
wikitext
text/x-wiki
{{Ligne présentation|4}}
{{Ligne présentation|4}}
{{Ligne présentation|4}}
{{Ligne présentation|4|1|
Crédits :
* Textes : [https://www.seb35.fr/ Seb35], sous licence [http://www.wtfpl.net/ WTFPL 2.0]
* Images : voir le détail pour chacune en cliquant soit sur l’image elle-même soit sur la petite icône en bas à droite du cadre de l’image
}}
{{Présentation|Questions ?}}
6e0e30ab9d125ad71dd223f294e1a84d76e905b2
Modèle:Bleu
10
140
383
2015-04-21T17:46:29Z
Seb35
1
exemple de modèle (qui servira peut-être d’ailleurs)
wikitext
text/x-wiki
<span style="color:blue">{{{1}}}</span>
1c395e1b6d637e85de095f32c494cf79bde7db8e
Présentation:Wikis/2/3
104
126
384
362
2015-04-21T17:54:32Z
Seb35
1
++
wikitext
text/x-wiki
* Catégories : organiser et hiérarchiser les pages (similaire aux catégories sous Wordpress)
** Exemples de catégories : Lieu > Lieu en France > Parc naturel régional français
* Espaces de noms : classer les pages selon leur nature
** Le titre commence par un mot-clé puis deux-points
** Exemples d’espaces de noms : [[:frwikipedia:Special:Allpages/Aide:|Aide]], [[:frwikipedia:Special:Allpages/Modèle:|Modèle]], [[:frwikipedia:Special:Allpages/Utilisateur:|Utilisateur/Utilisatrice]], [[:frwikipedia:Special:Allpages/:|(principal)]],
* Modèles : unifier les présentations et simplifier la syntaxe
** Exemple : le modèle « [[Modèle:Bleu|Bleu]] » rend le texte bleu : <tt><nowiki>{{Bleu|texte bleu}}</nowiki></tt> → {{Bleu|texte bleu}}
* Style : personnaliser le style d’un wiki
** Language CSS ([[:frwikipedia:Feuilles de style en cascade|Cascading Style Sheets]]) pour modifier en surface un ''skin'' existant
** Création possible de ''[[:mw:Category:All skins|skins]]'' entiers pour modifier entièrement l’apparence
* Extensions : ajouter des fonctionnalités
** [[:mw:Statistics about extensions|Environ 700]] [[:mw:Category:Extensions|extensions]] stables
{{Présentation|Coocooning : adapter l’outil à ses besoins propres}}
52b06b1db2d281589aa5dda17388335742cf4106
403
384
2015-04-21T21:21:10Z
Seb35
1
+exemples de skins
wikitext
text/x-wiki
* Catégories : organiser et hiérarchiser les pages (similaire aux catégories sous Wordpress)
** Exemples de catégories : Lieu > Lieu en France > Parc naturel régional français
* Espaces de noms : classer les pages selon leur nature
** Le titre commence par un mot-clé puis deux-points
** Exemples d’espaces de noms : [[:frwikipedia:Special:Allpages/Aide:|Aide]], [[:frwikipedia:Special:Allpages/Modèle:|Modèle]], [[:frwikipedia:Special:Allpages/Utilisateur:|Utilisateur/Utilisatrice]], [[:frwikipedia:Special:Allpages/:|(principal)]],
* Modèles : unifier les présentations et simplifier la syntaxe
** Exemple : le modèle « [[Modèle:Bleu|Bleu]] » rend le texte bleu : <tt><nowiki>{{Bleu|texte bleu}}</nowiki></tt> → {{Bleu|texte bleu}}
* Style : personnaliser le style d’un wiki
** Language CSS ([[:frwikipedia:Feuilles de style en cascade|Cascading Style Sheets]]) pour modifier en surface un ''skin'' existant
* ''[[:mw:Category:All skins|Skins]]'' : pour modifier entièrement l’apparence du wiki
** Exemples : [https://wiki.data.gouv.fr/wiki/Accueil Wiki Etalab], [https://docs.webplatform.org/wiki/Main_Page Web Plateform], [http://www.wiki-brest.net/index.php/Accueil Wiki-Brest]
* [[:mw:Category:Extensions|Extensions]] : ajouter des fonctionnalités
** [[:mw:Statistics about extensions|Environ 700]] extensions stables
{{Présentation|Coocooning : adapter l’outil à ses besoins propres}}
b987f7a2eea9005c4dd791671a81ca6cb9b794a1
404
403
2015-04-21T21:22:05Z
Seb35
1
+lien Common.css
wikitext
text/x-wiki
* Catégories : organiser et hiérarchiser les pages (similaire aux catégories sous Wordpress)
** Exemples de catégories : Lieu > Lieu en France > Parc naturel régional français
* Espaces de noms : classer les pages selon leur nature
** Le titre commence par un mot-clé puis deux-points
** Exemples d’espaces de noms : [[:frwikipedia:Special:Allpages/Aide:|Aide]], [[:frwikipedia:Special:Allpages/Modèle:|Modèle]], [[:frwikipedia:Special:Allpages/Utilisateur:|Utilisateur/Utilisatrice]], [[:frwikipedia:Special:Allpages/:|(principal)]],
* Modèles : unifier les présentations et simplifier la syntaxe
** Exemple : le modèle « [[Modèle:Bleu|Bleu]] » rend le texte bleu : <tt><nowiki>{{Bleu|texte bleu}}</nowiki></tt> → {{Bleu|texte bleu}}
* Style : personnaliser le style d’un wiki
** Language CSS ([[:frwikipedia:Feuilles de style en cascade|Cascading Style Sheets]]) pour [[MediaWiki:Common.css|modifier en surface]] un ''skin'' existant
* ''[[:mw:Category:All skins|Skins]]'' : pour modifier entièrement l’apparence du wiki
** Exemples : [https://wiki.data.gouv.fr/wiki/Accueil Wiki Etalab], [https://docs.webplatform.org/wiki/Main_Page Web Plateform], [http://www.wiki-brest.net/index.php/Accueil Wiki-Brest]
* [[:mw:Category:Extensions|Extensions]] : ajouter des fonctionnalités
** [[:mw:Statistics about extensions|Environ 700]] extensions stables
{{Présentation|Coocooning : adapter l’outil à ses besoins propres}}
e2495a6c88f98579f1cd3078f7b64a7c56402dec
MediaWiki:Common.css
8
4
385
355
2015-04-21T17:57:08Z
Seb35
1
+style sur les liens internes
css
text/css
/* Contenu en couleur noire et non grise */
div#content {
color: black;
}
/* Code en couleur grise */
pre, code, tt, kbd, samp, .mw-code {
color: #252525;
}
/* Espace de noms Présentation avec un style « diapositives » */
.ns-104.action-view {
background: white;
height: 95%;
}
.ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer, .ns-104 #contentSub {
display: none;
}
.ns-104.action-view #content {
width: 90%;
height: 95%;
margin: 1% auto;
padding: 1em;
border: 1px solid #A7D7F9;
}
.ns-104.action-view #bodyContent {
height: 95%;
}
.ns-104.action-view #mw-content-text {
height: 95%;
}
.ns-104 .mw-body-content {
font-size: 0.975em;
}
.ns-104 h1, .ns-104 h2, .ns-104 h3, .ns-104 h4, .ns-104 h5, .ns-104 h6 {
border-bottom: 0px;
}
.ns-104 .presentation-bar {
font-size: 80%;
}
.ns-104 #presentation-bar-left, .ns-104 #presentation-bar-right {
position: fixed;
bottom: 3%;
}
.ns-104 #presentation-bar-left {
left: 5%
}
.ns-104 #presentation-bar-right {
right: 5%;
}
.ns-104 .presentation-purge, .ns-104 .presentation-move {
display: none;
}
/* Spécifique à la présentation sur les wikis */
.ns-104 .mw-body .external {
background: none;
padding-right: 0px;
}
.ns-104 .mw-body a, .ns-104 .mw-body a:active,
.ns-104 .mw-body a.extiw, .ns-104 .mw-body a.extiw:active,
.ns-104 .mw-body .external, .ns-104 .mw-body .external:active {
color: black;
text-decoration: none;
}
.ns-104 .mw-body a:hover,
.ns-104 .mw-body a.extiw:hover,
.ns-104 .mw-body .external:hover {
border-bottom: 1px dotted black;
}
.ns-104 ul, .ns-104 ol {
line-height: 2em;
}
7bbcd093a7f6ffaffe1b758518b9653c75092aa8
Fichier:Graphe contributeur wiki Seb35.png
6
141
386
2015-04-21T18:06:40Z
Seb35
1
Exemple de graphe « toile d’araignée » de mon (Seb35) profil de contributeur sur les projets wiki – en général – selon la [http://www.anthere.org/post/2012/05/03/Motiver-les-participants-d-un-projet-wiki%3A-l-influence-des-r%C3%B4les théori...
wikitext
text/x-wiki
Exemple de graphe « toile d’araignée » de mon (Seb35) profil de contributeur sur les projets wiki – en général – selon la [http://www.anthere.org/post/2012/05/03/Motiver-les-participants-d-un-projet-wiki%3A-l-influence-des-r%C3%B4les théorie et les profils d’Anthere] et [http://lab.seb35.fr/participants-wiki.htm créé avec un de mes outils] (il est possible de rappeler ce profil [http://lab.seb35.fr/participants-wiki.htm#2-2-3-5-1-2-1-1-2-5 avec ce lien]).
Licence WTFPL 2.0.
bdb9e710a14af90d62afffbb44b952577f3dcba9
Présentation:Wikis/2/1
104
124
387
360
2015-04-21T18:17:45Z
Seb35
1
+image
wikitext
text/x-wiki
[[Fichier:Graphe contributeur wiki Seb35.png|thumb|300px|Exemple de profil de contributeur à un/des projets wiki : [http://lab.seb35.fr/participants-wiki.htm lien vers l’outil].|link=http://lab.seb35.fr/participants-wiki.htm#2-2-3-5-1-2-1-1-2-5]]
* [http://www.anthere.org/post/2012/05/03/Motiver-les-participants-d-un-projet-wiki%3A-l-influence-des-r%C3%B4les Théorie d’Anthere] : plusieurs rôles distincts
** Rôles proposés : créateur-expert, affineur, archiviste, contrôleur-évaluateur, patrouilleur, régulateur-facilitateur, bidouilleur technique, pompier médiateur, agent d’accueil, journaliste
** Possibilité de [http://lab.seb35.fr/participants-wiki.htm créer un graphe « toile d’araignée » dans ces rôles] en auto-évaluation voire pour d’autres personnes
* Bienveillance et empathie, ticket d’entrée (technique et social)
** Accueil chaleureux des nouveaux et bonne ambiance sociale peuvent contribuer au succès
** De même, simplifier l’usage de l’outil y contribue
** Entre les deux, organiser l’espace/les pages de façon pratique
** Rôle de chacun : auto-organisation et auto-gestion de la communauté elle-même
{{Présentation|Organiser une communauté : théorie et vue d’ensemble}}
2c5bfac39441b50ddd507e72a55d8710320fec49
388
387
2015-04-21T18:18:56Z
Seb35
1
typo
wikitext
text/x-wiki
[[Fichier:Graphe contributeur wiki Seb35.png|thumb|300px|Exemple de profil de contributeur à un/des projets wiki ([http://lab.seb35.fr/participants-wiki.htm lien vers l’outil]).|link=http://lab.seb35.fr/participants-wiki.htm#2-2-3-5-1-2-1-1-2-5]]
* [http://www.anthere.org/post/2012/05/03/Motiver-les-participants-d-un-projet-wiki%3A-l-influence-des-r%C3%B4les Théorie d’Anthere] : plusieurs rôles distincts
** Rôles proposés : créateur-expert, affineur, archiviste, contrôleur-évaluateur, patrouilleur, régulateur-facilitateur, bidouilleur technique, pompier médiateur, agent d’accueil, journaliste
** Possibilité de [http://lab.seb35.fr/participants-wiki.htm créer un graphe « toile d’araignée » dans ces rôles] en auto-évaluation voire pour d’autres personnes
* Bienveillance et empathie, ticket d’entrée (technique et social)
** Accueil chaleureux des nouveaux et bonne ambiance sociale peuvent contribuer au succès
** De même, simplifier l’usage de l’outil y contribue
** Entre les deux, organiser l’espace/les pages de façon pratique
** Rôle de chacun : auto-organisation et auto-gestion de la communauté elle-même
{{Présentation|Organiser une communauté : théorie et vue d’ensemble}}
4a74530a3cca1b826a19738a214b46e090de1599
Modèle:Présentation plan
10
142
389
2015-04-21T18:22:32Z
Seb35
1
modèle d’unification des plans
wikitext
text/x-wiki
<div style="margin:3em auto auto 2em">{{{1}}}</div>
c77f1f0f7274a23d5322374c7229363f9cfa120c
394
389
2015-04-21T18:28:07Z
Seb35
1
+titre
wikitext
text/x-wiki
<div style="margin:6em auto auto 2em">À venir dans cette section :<div style="margin:1.5em auto auto 1.5em">{{{1}}}</div></div>
224a4a2e81747e83cc394e9c74b9beab55cb24ac
395
394
2015-04-21T18:34:23Z
Seb35
1
style
wikitext
text/x-wiki
<div style="margin:10em auto auto 6em; border:6px double blueviolet">À venir dans cette section :<div style="margin:1.5em auto auto 1.5em">{{{1}}}</div></div>
178809f0f0817777be98e0735fb059924f344eda
396
395
2015-04-21T18:34:55Z
Seb35
1
style
wikitext
text/x-wiki
<div style="margin:10em auto auto 6em; border-left:6px double blueviolet; padding-left:0.5em">À venir dans cette section :<div style="margin:1.5em auto auto 1.5em">{{{1}}}</div></div>
1d8014c280b9d037881bf69964c3f4de8f31d010
Présentation:Wikis/2
104
123
390
357
2015-04-21T18:23:13Z
Seb35
1
+modèle présentation plan
wikitext
text/x-wiki
{{Présentation plan|
# [[Présentation:Wikis/2/1|Organiser une communauté : théorie et vue d’ensemble]]
# [[Présentation:Wikis/2/2|S’adapter à l’environnement local]]
# [[Présentation:Wikis/2/3|Coocooning : adapter l’outil à ses besoins propres]]
# [[Présentation:Wikis/2/4|Rôles technico-administratifs]]
}}
{{Présentation|Gérer un wiki MediaWiki}}
e2b8042974d17978fc5e6c975c92354c3d56adeb
Présentation:Wikis/3
104
128
391
364
2015-04-21T18:23:58Z
Seb35
1
+modèle présentation plan
wikitext
text/x-wiki
{{Présentation plan|
# [[Présentation:Wikis/3/1|Les bases de la syntaxe]]
# [[Présentation:Wikis/3/2|Les syntaxes avancées]]
# [[Présentation:Wikis/3/3|Gérer le vandalisme]]
# [[Présentation:Wikis/3/4|Gérer les images et médias]]
# [[Présentation:Wikis/3/5|Ressources d’aide]]
}}
{{Présentation|Le quotidien en pratique}}
3613a9dd7c7dcaa5ba5d1e93007d89d60e952f4e
Présentation:Wikis/1
104
99
393
293
2015-04-21T18:25:24Z
Seb35
1
+modèle présentation plan
wikitext
text/x-wiki
{{Présentation plan|
# [[Présentation:Wikis/1/1|Définition d’un wiki]]
# [[Présentation:Wikis/1/2|Historique des wikis]]
# [[Présentation:Wikis/1/3|Focus sur la famille de wikis la plus connue : Wikipédia]]
# [[Présentation:Wikis/1/4/1|Autres exemples de wikis]] : [[Présentation:Wikis/1/4/1|bases de connaissances thématiques]] et [[Présentation:Wikis/1/4/2|wikis de travail]]
# [[Présentation:Wikis/1/5|Questions juridiques]]
}}
{{Présentation|Présentation et histoire des wikis}}
42fd6c783dee842b828eb8aaaf84725bc435a7b9
Présentation:Wikis/1/2
104
105
397
358
2015-04-21T18:39:14Z
Seb35
1
correction
wikitext
text/x-wiki
{{Ligne présentation|3|1|
[[Fichier:WikiWikiWeb screenshot.png|200px|thumb|Page d’accueil de WikiWikiWeb en 2003.]]
1995 : création de l’outil [[:frwikipedia:WikiWikiWeb|WikiWikiWeb]] par [[:frwikipedia:Ward Cunningham|Ward Cunningham]]
* toujours disponible sur <tt>http://c2.com/cgi/wiki</tt>
* édition en cliquant sur « Edit » en bas (désactivé en décembre 2014 [http://c2.com/cgi/wiki?WikiWikiSystemNotice pour cause de spam])
}}
{{Ligne présentation|3|1|
[[Fichier:Old Wikipedia.png|200px|thumb|Page d’accueil de Wikipédia le 28 septembre 2002.]]
2001 : lancement de Wikipédia
}}
{{Ligne présentation|3|1|
2006-2010 : popularisation de Wikipédia et de l’outil
}}
{{Présentation|Historique des wikis}}
228631a97b7af4005cb708b7af5548e1da1ae04a
398
397
2015-04-21T18:39:25Z
Seb35
1
correction
wikitext
text/x-wiki
{{Ligne présentation|3|1|
[[Fichier:WikiWikiWeb screenshot.png|200px|thumb|Page d’accueil de WikiWikiWeb en 2003.]]
1995 : création de l’outil [[:frwikipedia:WikiWikiWeb|WikiWikiWeb]] par [[:frwikipedia:Ward Cunningham|Ward Cunningham]]
* toujours disponible sur <tt>http://c2.com/cgi/wiki</tt>
* édition en cliquant sur « EditText » en bas (désactivé en décembre 2014 [http://c2.com/cgi/wiki?WikiWikiSystemNotice pour cause de spam])
}}
{{Ligne présentation|3|1|
[[Fichier:Old Wikipedia.png|200px|thumb|Page d’accueil de Wikipédia le 28 septembre 2002.]]
2001 : lancement de Wikipédia
}}
{{Ligne présentation|3|1|
2006-2010 : popularisation de Wikipédia et de l’outil
}}
{{Présentation|Historique des wikis}}
4e598e1b4e1a42d8280d44c29af9c177d689f62e
Présentation:Wikis/1/5
104
122
399
354
2015-04-21T18:43:51Z
Seb35
1
changement lien
wikitext
text/x-wiki
* [[:frwikipedia:Licence libre|Licences libres]]
** Équation fondamentale : libre ≠ [[:frwikipedia:Freeware|gratuit]]
** Contrats spécifiques accordant des droits à l’utilisateur
** [[:frwikipedia:Licence de libre diffusion|Licences de libre diffusion]] : [[:frwikipedia:Creative Commons|Creative Commons]] [[:frwikipedia:Licence Creative Commons#Pas d'utilisation commerciale|CC-*-NC]] et [[:frwikipedia:Licence Creative Commons#Pas de travaux dérivés|CC-*-ND]]
** [[:frwikipedia:Copyleft|Licences ''copyleft'']] : [[:frwikipedia:Creative Commons|Creative Commons]] [https://creativecommons.org/licenses/by-sa/4.0/ CC-BY-SA], [[:frwikipedia:Licence publique générale GNU|GPL]], [[:frwikipedia:Licence Art Libre|Art Libre]]
** Licences non-''copyleft'' : [[:frwikipedia:Creative Commons|Creative Commons]] [[:frwikipedia:Creative Commons Attribution|CC-BY]] et [[:frwikipedia:Licence CC0|CC0]], [[:frwikipedia:Licence BSD|BSD]], [[:frwikipedia:Licence publique générale limitée GNU|LGPL]]
* Droits connexes rencontrés autour des wikis : [[:frwikipedia:Droits voisins du droit d'auteur en France|droits voisins]], [[:frwikipedia:Droit à l'image|droit à l’image]], [[:frwikipedia:Protection juridique des bases de données|droit des bases de données]], [[:frwikipedia:Vie privée et informatique|vie privée sur l’Internet]]
* Questions sous-jacentes aux licences libres :
** Économiques : rémunération des auteurs, [[:frwikipedia:Économie de l'immatériel|économie de l’immatériel]]
** Morales : propriété de l’immatériel, respect
** Philosophiques : [[:frwikipedia:Bien immatériel|biens immatériels]]/[[:frwikipedia:Biens non-rivaux|biens non-rivaux]], [[:frwikipedia:Cocréation|co-création]]/[[:frwikipedia:Intelligence collaborative|intelligence collaborative]]/''[[:frwikipedia:Wikinomics|wikinomics]]''
{{Présentation|Questions juridiques}}
ba554529fd832d9d0100f0a2e7aef8b302ad78e2
Fichier:Groupes utilisateur MediaWiki.svg
6
143
400
2015-04-21T20:43:13Z
Seb35
1
* Auteur : Seb35
* Licence : WTFPL 2.0
wikitext
text/x-wiki
* Auteur : Seb35
* Licence : WTFPL 2.0
ccb61d38d3160e532fe090800b9346d79bdc4bf7
Présentation:Wikis/2/4
104
127
401
363
2015-04-21T20:51:54Z
Seb35
1
++
wikitext
text/x-wiki
[[Fichier:Groupes utilisateur MediaWiki.svg|thumb|300px|Droits accordés aux groupes d’utilisateurs.]]
* Permissions : plusieurs [[Special:Listgrouprights|''droits [d’effectuer des actions]'']] sont disponibles ; chaque ''groupe d’utilisateurs'' dispose d’un certain nombre d’entre eux. Classiquement :
** utilisateurs enregistrés : ont plus de droits que les utilisateurs non-enregistrés
** administrateurs : peuvent supprimer, restaurer et bloquer des pages, bloquer des utilisateurs
** bureaucrates : peuvent modifier les droits des utilisateurs, notamment les droits d’administrateur
* donner plus de possibilité d’actions aux utilisateurs de confiance : valorisation, moins d’obstacles au quotidien
** par exemple : retrait de vérifications anti-spam, outils pour combattre le vandalisme : ''rollback'', suppression, blocage
{{Présentation|Rôles technico-administratifs}}
225c537135e7cd13522bdbc1f508aa2c2bbc83aa
Présentation:Wikis/2/2
104
125
402
361
2015-04-21T21:12:02Z
Seb35
1
++
wikitext
text/x-wiki
* Règles
** Savoir-vivre / [[:frwikipedia:Nétiquette|nétiquette]] : pour éviter que les contributeurs aient une mauvaise expérience
** Périmètre du wiki : énoncer clairement les contenus admissibles (thème/domaine, style de rédaction, etc.)
** Conventions : typographie, règles de mise en page
** Gouvernance : quelle est-elle ? comment s’organise-t-elle ?
* Discussions collectives
** Lieux : pages de discussions, pages par projets/thématiques, lieu central (« Bistro »)
* Récompenses : recevoir des récompenses pour le travail effectué sur un wiki fait ''en général'' plaisir
* Organisation pratique :
** Comment signaler un vandalisme important en cours ?
** Comment demander à supprimer une page ?
** Projets de maintenance :
*** de nombreuses [[Special:Specialpages#mw-specialpagesgroup-maintenance|pages spéciales]] indiquent des problèmes sur certaines pages
*** utilisation de bandeaux et/ou catégories pour signaler des problèmes
{{Présentation|S’adapter à l’environnement local}}
b984cc5f6f6878e4073e54a82b1a5a9e15cf30ea
Présentation:Wikis/5/1
104
133
415
369
2015-04-22T06:09:09Z
Seb35
1
++
wikitext
text/x-wiki
* [[:mw:|MediaWiki.org]] : [[:mw:Help:Contents/fr|aide utilisateur]], [[:mw:Manual:Contents|manuel technique]]
* La Wikipédia en français contient des [[:frwikipedia:Aide:Sommaire détaillé|ressources d’aide]] s’appliquant à tous les wikis (syntaxe, utilisation du logiciel) et peut servir d’exemple pour créer des règles locales
* [https://intern.wikimedia.ch/lists/listinfo/mediawiki-fr Liste de discussion mediawiki-fr]]
{{Présentation|Ressources d’aide}}
3285944c31ea9037cf79644f9a2403c1cddd22c9
416
415
2015-04-22T06:09:54Z
Seb35
1
typo
wikitext
text/x-wiki
* [[:mw:|MediaWiki.org]] : [[:mw:Help:Contents/fr|aide utilisateur]], [[:mw:Manual:Contents|manuel technique]]
* La Wikipédia en français contient des [[:frwikipedia:Aide:Sommaire détaillé|ressources d’aide]] s’appliquant à tous les wikis (syntaxe, utilisation du logiciel) et peut servir d’exemple pour créer des règles locales
* [https://intern.wikimedia.ch/lists/listinfo/mediawiki-fr Liste de discussion mediawiki-fr]]
{{Présentation|Ressources d’aide}}
215fa5b0d5583a99bd6bdf72d41dd8c1725585d7
418
416
2015-04-22T06:12:33Z
Seb35
1
syntaxe
wikitext
text/x-wiki
* [[:mw:|MediaWiki.org]] : [[:mw:Help:Contents/fr|aide utilisateur]], [[:mw:Manual:Contents|manuel technique]]
* La Wikipédia en français contient des [[:frwikipedia:Aide:Sommaire détaillé|ressources d’aide]] s’appliquant à tous les wikis (syntaxe, utilisation du logiciel) et peut servir d’exemple pour créer des règles locales
* [https://intern.wikimedia.ch/lists/listinfo/mediawiki-fr Liste de discussion mediawiki-fr]
{{Présentation|Ressources d’aide}}
24eae61f87811383b68eb3c19caa17028e900b95
442
418
2015-04-23T15:51:36Z
Seb35
1
Seb35 a déplacé la page [[Présentation:Wikis/3/5]] vers [[Présentation:Wikis/5/1]] sans laisser de redirection : plus logique de mettre les ressources à la fin
wikitext
text/x-wiki
* [[:mw:|MediaWiki.org]] : [[:mw:Help:Contents/fr|aide utilisateur]], [[:mw:Manual:Contents|manuel technique]]
* La Wikipédia en français contient des [[:frwikipedia:Aide:Sommaire détaillé|ressources d’aide]] s’appliquant à tous les wikis (syntaxe, utilisation du logiciel) et peut servir d’exemple pour créer des règles locales
* [https://intern.wikimedia.ch/lists/listinfo/mediawiki-fr Liste de discussion mediawiki-fr]
{{Présentation|Ressources d’aide}}
24eae61f87811383b68eb3c19caa17028e900b95
446
442
2015-04-23T16:00:06Z
Seb35
1
+liste wikis territoriaux
wikitext
text/x-wiki
* [[:mw:|MediaWiki.org]] : [[:mw:Help:Contents/fr|aide utilisateur]], [[:mw:Manual:Contents|manuel technique]]
* La Wikipédia en français contient des [[:frwikipedia:Aide:Sommaire détaillé|ressources d’aide]] s’appliquant à tous les wikis (syntaxe, utilisation du logiciel) et peut servir d’exemple pour créer des règles locales
* [https://intern.wikimedia.ch/lists/listinfo/mediawiki-fr Liste de discussion sur MediaWiki (en français)]
* [http://listes.infini.fr/wws/info/wikis-territoriaux Liste de discussion sur les wikis territoriaux]
{{Présentation|Ressources d’aide}}
a73f2aa25a9f6ce2ffd502aeaecd33caea124508
Présentation:Wikis/4/1
104
136
417
379
2015-04-22T06:11:06Z
Seb35
1
++
wikitext
text/x-wiki
* Philosophie du partage : discussion et explication nécessaires
* Paternité des œuvres et respect des œuvres créées
{{Présentation|Licences et philosophie}}
5489b9fcf5b7e23c446a4511c490e19f972687fc
423
417
2015-04-23T11:15:28Z
Seb35
1
++
wikitext
text/x-wiki
* Philosophie du partage :
** Introduire l’outil wiki : tout le monde peut contribuer et l’enrichir [affirmation positive]
** Aux sceptiques : Wikipédia fonctionne depuis 10 ans sans problème majeur
** Aux critiques « droit d’auteur, ça m’appartient » : c’est toujours le cas + le but de collaborer sur un wiki est de partager et enrichir…
** Aux critiques « droit d’auteur, je veux être payé » : la non-commercialisation serait un problème majeur à la dissémination
** Aux critiques « droit d’auteur, ''on'' va dénaturer mon texte » : le droit moral en France est inaliénable + relativiser
{{Présentation|Licences et philosophie}}
02acc15d8888f0231bc8c6fd46d0326ef2e560f3
427
423
2015-04-23T11:17:49Z
Seb35
1
Seb35 a déplacé la page [[Présentation:Wikis/4/2]] vers [[Présentation:Wikis/4/1]] sans laisser de redirection : échange
wikitext
text/x-wiki
* Philosophie du partage :
** Introduire l’outil wiki : tout le monde peut contribuer et l’enrichir [affirmation positive]
** Aux sceptiques : Wikipédia fonctionne depuis 10 ans sans problème majeur
** Aux critiques « droit d’auteur, ça m’appartient » : c’est toujours le cas + le but de collaborer sur un wiki est de partager et enrichir…
** Aux critiques « droit d’auteur, je veux être payé » : la non-commercialisation serait un problème majeur à la dissémination
** Aux critiques « droit d’auteur, ''on'' va dénaturer mon texte » : le droit moral en France est inaliénable + relativiser
{{Présentation|Licences et philosophie}}
02acc15d8888f0231bc8c6fd46d0326ef2e560f3
429
427
2015-04-23T11:26:10Z
Seb35
1
++
wikitext
text/x-wiki
* Philosophie du partage :
** Introduire l’outil wiki : tout le monde peut contribuer et l’enrichir [affirmation positive]
** Aux sceptiques : Wikipédia fonctionne depuis 10 ans sans problème majeur
** Aux critiques « droit d’auteur, ça m’appartient » : c’est toujours le cas + le but de collaborer sur un wiki est de partager et enrichir…
** Aux critiques « droit d’auteur, je veux être payé » : la non-commercialisation serait un problème majeur à la dissémination
** Aux critiques « droit d’auteur, ''on'' va dénaturer mon texte » : le droit moral en France est inaliénable + relativiser
* Présenter l’objet du wiki et ses règles de base
** Mode « dialogue » préférable si possible, plus proche de la philosophie wiki
{{Présentation|Licences et philosophie}}
e92bcf4d6da685a98dc71f30b3b904b60f6aac8f
Présentation:Wikis
104
98
419
208
2015-04-22T07:07:30Z
Seb35
1
++
wikitext
text/x-wiki
<div style="margin:5em auto 4em 3em">''Les wikis, objets de collecte et dissémination de savoirs''</div>
Plan de la présentation
# [[Présentation:Wikis/1|Présentation et histoire des wikis]]
# [[Présentation:Wikis/2|Gérer un wiki MediaWiki]]
# [[Présentation:Wikis/3|Le quotidien en pratique]]
# [[Présentation:Wikis/4|Accompagner des utilisateurs]]
934aff36c2d368a26090aa27be6e6c58eb173db2
420
419
2015-04-22T07:08:46Z
Seb35
1
+
wikitext
text/x-wiki
<div style="margin:5em auto 4em 3em">''Les wikis, objets de collecte et dissémination de savoirs''</div>
<div style="margin-left:1em">Plan de la présentation
# [[Présentation:Wikis/1|Présentation et histoire des wikis]]
# [[Présentation:Wikis/2|Gérer un wiki MediaWiki]]
# [[Présentation:Wikis/3|Le quotidien en pratique]]
# [[Présentation:Wikis/4|Accompagner des utilisateurs]]</div>
{{Présentation|Wikis}}
bda7ffeeccce8d8715d029c3a937e9b48f5b3090
421
420
2015-04-22T07:12:00Z
Seb35
1
+image
wikitext
text/x-wiki
[[Fichier:HNL Wiki Wiki Bus.jpg|right|400px|[[:enwikipedia:Wiki Wiki Shuttle|Wiki Wiki Shuttle]]]]
<div style="margin:5em auto 4em 3em">''Les wikis, objets de collecte et dissémination de savoirs''</div>
<div style="margin-left:1em">Plan de la présentation
# [[Présentation:Wikis/1|Présentation et histoire des wikis]]
# [[Présentation:Wikis/2|Gérer un wiki MediaWiki]]
# [[Présentation:Wikis/3|Le quotidien en pratique]]
# [[Présentation:Wikis/4|Accompagner des utilisateurs]]</div>
{{Présentation|Wikis}}
30e6b9cd93beb78752ec7cdfe568e3b5b6a841c8
439
421
2015-04-23T15:18:40Z
Seb35
1
unification style, +1
wikitext
text/x-wiki
[[Fichier:HNL Wiki Wiki Bus.jpg|right|400px|[[:enwikipedia:Wiki Wiki Shuttle|Wiki Wiki Shuttle]]]]
<div style="margin:5em auto auto 3em">''Les wikis, objets de collecte et dissémination de savoirs''</div>
{{Présentation plan|texte=Plan de la présentation :|
# [[Présentation:Wikis/1|Présentation et histoire des wikis]]
# [[Présentation:Wikis/2|Gérer un wiki MediaWiki]]
# [[Présentation:Wikis/3|Le quotidien en pratique]]
# [[Présentation:Wikis/4|Accompagner des utilisateurs]]
# [[Présentation:Wikis/5|Coda : références & crédits]]
}}
{{Présentation|Wikis}}
61d4a4e045aa5b04f9b503311c35d16249d6eb93
444
439
2015-04-23T15:53:15Z
Seb35
1
lien
wikitext
text/x-wiki
[[Fichier:HNL Wiki Wiki Bus.jpg|right|400px|[[:enwikipedia:Wiki Wiki Shuttle|Wiki Wiki Shuttle]]]]
<div style="margin:5em auto auto 3em">''Les wikis, objets de collecte et dissémination de savoirs''</div>
{{Présentation plan|texte=Plan de la présentation :|
# [[Présentation:Wikis/1|Présentation et histoire des wikis]]
# [[Présentation:Wikis/2|Gérer un wiki MediaWiki]]
# [[Présentation:Wikis/3|Le quotidien en pratique]]
# [[Présentation:Wikis/4|Accompagner des utilisateurs]]
# [[Présentation:Wikis/5/1|Coda : références & crédits]]
}}
{{Présentation|Wikis}}
e8be87161b72497c8105842d11c4447fed84af8b
Présentation:Wikis/3/3
104
131
422
410
2015-04-22T14:19:38Z
Seb35
1
ortho
wikitext
text/x-wiki
* Surveiller les modifications récentes
** Possibilité de recevoir un flux [[:frwikipedia:RSS|RSS]]/[[:frwikipedia:Atom|Atom]]
** La plupart des spammeurs aujourd’hui se créent un compte voire valident l’autorisation envoyée par email
** Révoquer les tests et les fragrants délits, prévenir les contrevenants de façon proportionnée (un ou plusieurs avertissements, puis blocage temporaire, puis blocage permanent)
** Idéalement plusieurs contributeurs se relaient (pas forcément de façon formelle)
* Gérer le spam
** Bloquer les utilisateurs manifestement spammeurs (pavé de texte en anglais ou russe)
** Une extension, [[:mw:Extension:Nuke|Nuke]], permet de supprimer toutes les contributions d’un utilisateur
* Prévenir le spam
** Extension [[:mw:Extension:QuestyCaptcha|QuestyCaptcha]] (poser une question demandant réflexion) ; si brisé, changer les questions
** Retirer le spam pour ne pas encourager les spammeurs
** Faire que la communauté ait les moyens de traiter efficacement le spam
{{Présentation|Gérer le vandalisme}}
df04c4e50656f32f4c04f04fd3b366797dcc6ce2
Présentation:Wikis/4/2
104
135
424
378
2015-04-23T11:16:00Z
Seb35
1
Seb35 a déplacé la page [[Présentation:Wikis/4/1]] vers [[Présentation:Wikis/4/2bis]] sans laisser de redirection : échange
wikitext
text/x-wiki
* Faire manipuler la syntaxe
* Montrer comment verser un média et comment l’inclure dans une page
{{Présentation|Syntaxe et médias}}
eeed97f27ee866373cd4572eff306a650373d623
428
424
2015-04-23T11:18:19Z
Seb35
1
Seb35 a déplacé la page [[Présentation:Wikis/4/2bis]] vers [[Présentation:Wikis/4/2]] sans laisser de redirection : échange
wikitext
text/x-wiki
* Faire manipuler la syntaxe
* Montrer comment verser un média et comment l’inclure dans une page
{{Présentation|Syntaxe et médias}}
eeed97f27ee866373cd4572eff306a650373d623
430
428
2015-04-23T11:28:14Z
Seb35
1
++
wikitext
text/x-wiki
* Faire l’interface en tant que contributeur → appropriation de l’outil et de la philosophie
* Idéalement faire manipuler la syntaxe de base
* Rassurer sur le fait de faire des erreurs
* Chercher un sujet d’intérêt du contributeur-apprenti (aisance sur le domaine à défaut de l’outil)
* Montrer comment verser un média et comment l’inclure dans une page
{{Présentation|Syntaxe et médias}}
a4fe7581a6c07e8ac14e483289a97e878c29e2d9
431
430
2015-04-23T11:32:02Z
Seb35
1
typo
wikitext
text/x-wiki
* Faire manipuler l’interface en tant que contributeur → appropriation de l’outil et de la philosophie
* Idéalement faire manipuler la syntaxe de base
* Rassurer sur le fait de faire des erreurs
* Chercher un sujet d’intérêt du contributeur-apprenti (aisance sur le domaine à défaut de l’outil)
* Montrer comment verser un média et comment l’inclure dans une page
{{Présentation|Syntaxe et médias}}
dba723775662b6e924829bd29e159426dc7da368
433
431
2015-04-23T11:34:20Z
Seb35
1
+1
wikitext
text/x-wiki
* Faire manipuler l’interface en tant que contributeur → appropriation de l’outil et de la philosophie
* Idéalement faire manipuler la syntaxe de base
* Rassurer sur le fait de faire des erreurs
* Chercher un sujet d’intérêt du contributeur-apprenti (aisance sur le domaine à défaut de l’outil)
* Éviter de faire soi-même, laisser la main au contributeur-apprenti
* Montrer comment verser un média et comment l’inclure dans une page
{{Présentation|Syntaxe et médias}}
eb30dd351126c3198681998edbe00d8b1ee27ec8
436
433
2015-04-23T11:40:38Z
Seb35
1
changement du titre, +1
wikitext
text/x-wiki
* Faire créer un compte ; expliquer les avantages (stabilité du nom, outils supplémentaires)
* Faire manipuler l’interface en tant que contributeur → appropriation de l’outil et de la philosophie
* Idéalement faire manipuler la syntaxe de base
* Rassurer sur le fait de faire des erreurs
* Chercher un sujet d’intérêt du contributeur-apprenti (aisance sur le domaine à défaut de l’outil)
* Éviter de faire soi-même, laisser la main au contributeur-apprenti
* Montrer comment verser un média et comment l’inclure dans une page
{{Présentation|Interface et syntaxe}}
1e7ca95a66a6faa4d2d1b6ec8034b401b950e4fc
Présentation:Wikis/4
104
134
425
392
2015-04-23T11:16:37Z
Seb35
1
échange
wikitext
text/x-wiki
{{Présentation plan|
# [[Présentation:Wikis/4/1|Licences et philosophie]]
# [[Présentation:Wikis/4/2|Syntaxe et médias]]
# [[Présentation:Wikis/4/3|Faire découvrir l’ensemble des rôles]]
# [[Présentation:Wikis/4/4|Présentations collectives]]
}}
{{Présentation|Accompagner des utilisateurs}}
3e8c0fbf8b4decc8925df21e95646d7abb14772f
432
425
2015-04-23T11:33:33Z
Seb35
1
changement titre
wikitext
text/x-wiki
{{Présentation plan|
# [[Présentation:Wikis/4/1|Licences et philosophie]]
# [[Présentation:Wikis/4/2|Syntaxe et médias]]
# [[Présentation:Wikis/4/3|De la communauté]]
# [[Présentation:Wikis/4/4|Présentations collectives]]
}}
{{Présentation|Accompagner des utilisateurs}}
8c559fd4b1f613488f030dd7246f85309047c957
435
432
2015-04-23T11:40:13Z
Seb35
1
changement de nom
wikitext
text/x-wiki
{{Présentation plan|
# [[Présentation:Wikis/4/1|Licences et philosophie]]
# [[Présentation:Wikis/4/2|Interface et syntaxe]]
# [[Présentation:Wikis/4/3|De la communauté]]
# [[Présentation:Wikis/4/4|Présentations collectives]]
}}
{{Présentation|Accompagner des utilisateurs}}
1d013979da98ec5839e209767ce26fd6eb7dc8f8
Présentation:Wikis/4/4
104
138
434
381
2015-04-23T11:38:22Z
Seb35
1
+1
wikitext
text/x-wiki
* Présenter la philosophie des wikis et le rôle de ce wiki spécifique
* Montrer quelques articles
* Désinhiber de la contribution – atelier individuel ou en très petits groupes
** ne pas avoir peur des erreurs, toujours corrigeables
** bienveillance des autres contributeurs, accueil bienveillant
** faire manipuler la syntaxe et la contribution
* Durée : 1 heure est un peu court ; 1h15 ou 1h30 conseillé
{{Présentation|Présentations collectives}}
52b85946c75d842a3050b032119de9cb68f0805f
Présentation:Wikis/4/3
104
137
437
380
2015-04-23T11:40:58Z
Seb35
1
++
wikitext
text/x-wiki
* Parler de l’aspect communautaire du wiki
* Parler des éventuelles rencontres physiques
* Évoquer les rôles autres que contributeur-expert vers lesquels évoluer
* Montrer les [[Special:Recentchanges|modifications récentes]], bistros et autres lieux d’échange
{{Présentation|De la communauté}}
b24a6bad07a2c190c88cdf7dfb43301e104a62d5
Modèle:Présentation plan
10
142
438
396
2015-04-23T15:14:39Z
Seb35
1
+texte personnalisable
wikitext
text/x-wiki
<div style="margin:10em auto auto 6em; border-left:6px double blueviolet; padding-left:0.5em">{{{texte|À venir dans cette section :}}}<div style="margin:1.5em auto auto 1.5em">{{{1}}}</div></div>
1b5e0e6d35c0788e5da35adc0e942d675726d374
Présentation:Wikis/3
104
128
440
391
2015-04-23T15:43:47Z
Seb35
1
-1
wikitext
text/x-wiki
{{Présentation plan|
# [[Présentation:Wikis/3/1|Les bases de la syntaxe]]
# [[Présentation:Wikis/3/2|Les syntaxes avancées]]
# [[Présentation:Wikis/3/3|Gérer le vandalisme]]
# [[Présentation:Wikis/3/4|Gérer les images et médias]]
}}
{{Présentation|Le quotidien en pratique}}
41d33cf0f8cb088490680b5934574e987d791569
Présentation:Wikis/5/2
104
139
441
409
2015-04-23T15:50:52Z
Seb35
1
Seb35 a déplacé la page [[Présentation:Wikis/5]] vers [[Présentation:Wikis/5/2]] sans laisser de redirection : rationalisation
wikitext
text/x-wiki
{{Ligne présentation|4}}
{{Ligne présentation|4}}
{{Ligne présentation|4}}
{{Ligne présentation|4|1|
Crédits :
* Textes : [https://www.seb35.fr/ Seb35], sous licence [http://www.wtfpl.net/ WTFPL 2.0]
* Images : voir le détail pour chacune en cliquant soit sur l’image elle-même soit sur la petite icône en bas à droite du cadre de l’image
}}
{{Présentation|Questions ?}}
6e0e30ab9d125ad71dd223f294e1a84d76e905b2
443
441
2015-04-23T15:52:59Z
Seb35
1
changement
wikitext
text/x-wiki
{{Ligne présentation|4}}
{{Ligne présentation|4}}
{{Ligne présentation|4}}
{{Ligne présentation|4|1|
* Textes : [https://www.seb35.fr/ Seb35], sous licence [http://www.wtfpl.net/ WTFPL 2.0]
* Images : voir le détail pour chacune en cliquant soit sur l’image elle-même soit sur la petite icône en bas à droite du cadre de l’image
}}
{{Présentation|Crédits}}
51b635c933ead4ebc0f6e2fad410585fba1cdcc4
445
443
2015-04-23T15:56:42Z
Seb35
1
mise en page
wikitext
text/x-wiki
{{Ligne présentation|3}}
{{Ligne présentation|3}}
{{Ligne présentation|3|1|
* Textes : [https://www.seb35.fr/ Seb35], sous licence [http://www.wtfpl.net/ WTFPL 2.0]
* Images : voir le détail pour chacune en cliquant soit sur l’image elle-même soit sur la petite icône en bas à droite du cadre de l’image
}}
{{Présentation|Crédits}}
57738429eba2b5502871e7155302a909852beb5b
447
445
2015-04-23T16:06:43Z
Seb35
1
+mise en page
wikitext
text/x-wiki
{{Ligne présentation|2}}
{{Ligne présentation|2|1|
* Textes : [https://www.seb35.fr/ Seb35], sous licence [http://www.wtfpl.net/ WTFPL 2.0]
* Images : voir le détail pour chacune en cliquant soit sur l’image elle-même soit sur la petite icône en bas à droite du cadre de l’image
* Mise en page : l’espace de noms Présentation: est présenté ainsi par [https://www.seb35.fr/ Seb35] ; c’est en test et deviendra peut-être une extension MediaWiki à part entière
}}
{{Présentation|Crédits}}
43b98c76b196884dae9439ca43ea2e3ab3cf1562
448
447
2015-04-23T16:10:39Z
Seb35
1
+date
wikitext
text/x-wiki
{{Ligne présentation|2}}
{{Ligne présentation|2|1|
* Textes : [https://www.seb35.fr/ Seb35], sous licence [http://www.wtfpl.net/ WTFPL 2.0]
* Images : voir le détail pour chacune en cliquant soit sur l’image elle-même soit sur la petite icône en bas à droite du cadre de l’image
* Mise en page : l’espace de noms Présentation: est présenté ainsi par [https://www.seb35.fr/ Seb35] ; c’est en test (avril 2015) et deviendra peut-être une extension MediaWiki à part entière
}}
{{Présentation|Crédits}}
a1f3ab6bd4673b596febcb0d22051f316fcf467c
Module:Présentation
828
104
449
353
2015-04-23T16:46:34Z
Seb35
1
+lien pour page 0
wikitext
text/x-wiki
--[[
]]
local presentation = {}
function presentation.total( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
return table.getn( sequence )
end
function presentation.current( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i, v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return i
end
end
return 0
end
function presentation.next( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i, v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i+1]
end
end
if not mw.title.getCurrentTitle().isSubpage then
return 0
end
return ''
end
function presentation.previous( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i, v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i-1]
end
end
return ''
end
function presentation._expandSequence( title )
local list = {};
title = title.rootPageTitle;
while true do
if title:subPageTitle( '0' ).exists then
title = title:subPageTitle( '0' )
elseif title:subPageTitle( '1' ).exists then
title = title:subPageTitle( '1' )
elseif tonumber(title.subpageText) ~= nil then
if not title.exists then
if title.baseText == title.rootText then
break
end
title = title.basePageTitle.basePageTitle:subPageTitle( tostring(tonumber(title.basePageTitle.subpageText)+1) )
else
title = title.basePageTitle:subPageTitle( tostring(tonumber(title.subpageText)+1) )
end
else
break
end
if title.exists then
list[table.getn(list)+1] = title.fullText
end
end
return list
end
return presentation
44377ec994d25f0a27c16862f30dc6974fc927b1
450
449
2015-04-23T16:48:49Z
Seb35
1
cht’i bug
wikitext
text/x-wiki
--[[
]]
local presentation = {}
function presentation.total( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
return table.getn( sequence )
end
function presentation.current( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i, v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return i
end
end
return 0
end
function presentation.next( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i, v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i+1]
end
end
if not mw.title.getCurrentTitle().isSubpage then
return sequence[1]
end
return ''
end
function presentation.previous( frame )
local sequence = presentation._expandSequence( mw.title.getCurrentTitle() )
for i, v in pairs( sequence ) do
if v == mw.title.getCurrentTitle().fullText then
return sequence[i-1]
end
end
return ''
end
function presentation._expandSequence( title )
local list = {};
title = title.rootPageTitle;
while true do
if title:subPageTitle( '0' ).exists then
title = title:subPageTitle( '0' )
elseif title:subPageTitle( '1' ).exists then
title = title:subPageTitle( '1' )
elseif tonumber(title.subpageText) ~= nil then
if not title.exists then
if title.baseText == title.rootText then
break
end
title = title.basePageTitle.basePageTitle:subPageTitle( tostring(tonumber(title.basePageTitle.subpageText)+1) )
else
title = title.basePageTitle:subPageTitle( tostring(tonumber(title.subpageText)+1) )
end
else
break
end
if title.exists then
list[table.getn(list)+1] = title.fullText
end
end
return list
end
return presentation
63afab35de10fa2e67568a9c090356f3ab4efc5f
MediaWiki:Common.css
8
4
451
385
2015-04-23T16:51:06Z
Seb35
1
visibilité des liens
css
text/css
/* Contenu en couleur noire et non grise */
div#content {
color: black;
}
/* Code en couleur grise */
pre, code, tt, kbd, samp, .mw-code {
color: #252525;
}
/* Espace de noms Présentation avec un style « diapositives » */
.ns-104.action-view {
background: white;
height: 95%;
}
.ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer, .ns-104 #contentSub {
display: none;
}
.ns-104.action-view #content {
width: 90%;
height: 95%;
margin: 1% auto;
padding: 1em;
border: 1px solid #A7D7F9;
}
.ns-104.action-view #bodyContent {
height: 95%;
}
.ns-104.action-view #mw-content-text {
height: 95%;
}
.ns-104 .mw-body-content {
font-size: 0.975em;
}
.ns-104 h1, .ns-104 h2, .ns-104 h3, .ns-104 h4, .ns-104 h5, .ns-104 h6 {
border-bottom: 0px;
}
.ns-104 .presentation-bar {
font-size: 80%;
}
.ns-104 #presentation-bar-left, .ns-104 #presentation-bar-right {
position: fixed;
bottom: 3%;
}
.ns-104 #presentation-bar-left {
left: 5%
}
.ns-104 #presentation-bar-right {
right: 5%;
}
.ns-104 .presentation-purge, .ns-104 .presentation-move {
display: none;
}
/* Spécifique à la présentation sur les wikis */
.ns-104 .mw-body .external {
background: none;
padding-right: 0px;
}
.ns-104 .mw-body a, .ns-104 .mw-body a:active,
.ns-104 .mw-body a.extiw, .ns-104 .mw-body a.extiw:active,
.ns-104 .mw-body .external, .ns-104 .mw-body .external:active {
color: black;
border-bottom: 1px dotted black;
}
.ns-104 .mw-body a:hover,
.ns-104 .mw-body a.extiw:hover,
.ns-104 .mw-body .external:hover {
border-bottom: 1px dotted black;
}
.ns-104 ul, .ns-104 ol {
line-height: 2em;
}
c142b815edb19c61184f6f4f741b98d389b783c0
Accueil
0
1
452
136
2015-04-25T09:31:55Z
Seb35
1
/* Autres */ +lien [[Présentation:Wikis]]
wikitext
text/x-wiki
Ce wiki me sert de base de connaissance dans le cadre des activités de [[:seb35:|mon entreprise]].
Il peut comporter des pages de contenu ou simplement des liens vers d’autres sites pour les activités collaboratives. Vous pouvez vous créer un compte si vous voulez discuter ou modifier une erreur.
== Pages du wiki ==
=== Tutoriaux ===
{{Special:Allpages/Tutorial:}}
=== Autres ===
* [[Présentation:Wikis]]
* [[Archéo Lex]]
* [[Syntaxes de formatage léger]]
* [[Log/Seb35]]
* [[MediaWiki]]
9f801d3e323f2a9bbf5b9fb3c962eb4d3172d2b8
453
452
2015-06-15T09:25:35Z
Seb35
1
liens statiques
wikitext
text/x-wiki
Ce wiki me sert de base de connaissance dans le cadre des activités de [[:seb35:|mon entreprise]].
Il peut comporter des pages de contenu ou simplement des liens vers d’autres sites pour les activités collaboratives. Vous pouvez vous créer un compte si vous voulez discuter ou modifier une erreur.
== Pages du wiki ==
=== Tutoriaux ===
* [[Tutorial:Beautiful MediaWiki URLs]]
* [[Tutorial:Packaging de WebApps]]
=== Autres ===
* [[Présentation:Wikis]]
* [[Archéo Lex]]
* [[Syntaxes de formatage léger]]
* [[Log/Seb35]]
* [[MediaWiki]]
97aee9da040a03ccf7a04b678ab0c81dc883dac2
457
453
2015-09-08T16:05:11Z
Seb35
1
+page sur les CRM
wikitext
text/x-wiki
Ce wiki me sert de base de connaissance dans le cadre des activités de [[:seb35:|mon entreprise]].
Il peut comporter des pages de contenu ou simplement des liens vers d’autres sites pour les activités collaboratives. Vous pouvez vous créer un compte si vous voulez discuter ou modifier une erreur.
== Pages du wiki ==
=== Tutoriaux ===
* [[Tutorial:Beautiful MediaWiki URLs]]
* [[Tutorial:Packaging de WebApps]]
=== Autres ===
* [[Présentation:Wikis]]
* [[CRM]] (comparaison de CRMs libres)
* [[Archéo Lex]]
* [[Syntaxes de formatage léger]]
* [[Log/Seb35]]
* [[MediaWiki]]
446d228889f8db94f25b3717b08b3b8cc941efca
CRM
0
146
456
2015-09-08T16:04:14Z
Seb35
1
page récapitulative des CRMs testés récemment
wikitext
text/x-wiki
Les '''CRM''' (Customer/Client Relationship Manager) ou '''GRC''' en français (gestion de la gelation client) permettent à une entreprise de consigner les différentes interactions qu’elle a avec un client donné. Les fonctionnalités varient beaucoup d’un logiciel à l’autre, et la délimitation peut parfois être fine entre les CRM et les ERP (Enterprise Ressource Planning, en français PGI/progiciel de gestion intégré), ces derniers étant globalement plus orientés vers la gestion backend de l’entreprise.
Cette page se concentre sur les CRM libres :
* CiviCRM, orienté associations d’une certaine taille et/ou dispersée géographiquement
* SugarCRM, très orienté pour les commerciaux (logiciel limite libre)
* SuiteCRM, fork récent de SugarCRM
* vtiger CRM, fork plus ancien de SugarCRM
* CremeCRM
* Dolibarr
* Odoo (anciennement OpenERP)
* Galette, orienté petites associations pour la gestion d’adhérents
== SugarCRM Community Edition ==
* Site : https://www.sugarcrm.com/
* Licence : AGPLv3 + conditions spécifiques non-libres à accepter y compris pour une installation locale (non-distribution des forks, sous-licenciement des données utilisateur, etc. = bizarre pour une installation locale, ça pourrait être justifié pour une installation hébergée/SaaS), nombreuses critiques sur le caractères (encore) libre de SugarCRM
* Modèle économique : open-core, support pour éditions payantes, version libre et gratuite maintenue au minimum
* Téléchargement : [http://sourceforge.net/projects/sugarcrm/files/ tarball sur SourceForge], pas de dépôt de gestion de version public ?
* Avis : très orienté commercial : contacts clients, prospects, email en masse, ROI, appels programmés
* Difficulté d’installation : relativement simple
* Difficulté de configuration : très peu de configuration initiale
* Difficulté de prise en main utilisateur : ''(non-suffisamment-testé-pour-avoir-un-avis)''
== SuiteCRM ==
* Site : https://suitecrm.com/
* Licence : AGPLv3
* Modèle économique : libre développé par une entreprise et une petite communauté, services et support payants, installation hébergée (SaaS) proposée
* Téléchargement : [https://suitecrm.com/download tarball], [https://github.com/salesagility/SuiteCRM dépôt Git]
* Avis : (similaire à SugarCRM) très orienté commercial : contacts clients, prospects, email en masse, ROI, appels programmés ; un peu moins joli et pratique que SugarCRM
* Difficulté d’installation : relativement simple
* Difficulté de configuration : très peu de configuration initiale
* Difficulté de prise en main utilisateur : ''(non-suffisamment-testé-pour-avoir-un-avis)''
== CiviCRM ==
* Site : https://civicrm.org/
* Licence : AGPLv3
* Modèle économique : libre développé par une communauté de taille moyenne et une entreprise, quelques consultants dans le monde entier, installations hébergées (SaaS) proposées
* Téléchargement : [https://civicrm.org/download/list tarball], [https://github.com/civicrm/civicrm-core dépôt Git]
* Avis : assez adapté à la cible (grosses associations et non-profits, surtout dispersées géographiquement), demande un temps d’adaptation pour comprendre les concepts de base, puissant (en fonction du temps passé à le configurer)
* Difficulté d’installation : pas trop compliquée
* Difficulté de configuration : pas trop compliqué, mais long ou demandant une certaine habitude
* Difficulté de prise en main utilisateur : une fois les concepts de base assimilés (4 h de formation ou quelques jours d’autoformation), les worflows semblent assez naturels
a6cbc3fe6956063c560a6e86bab0113d99e1d5a5
458
456
2015-09-08T20:42:40Z
Seb35
1
+dolibarr
wikitext
text/x-wiki
Les '''CRM''' (Customer/Client Relationship Manager) ou '''GRC''' en français (gestion de la gelation client) permettent à une entreprise de consigner les différentes interactions qu’elle a avec un client donné. Les fonctionnalités varient beaucoup d’un logiciel à l’autre, et la délimitation peut parfois être fine entre les CRM et les ERP (Enterprise Ressource Planning, en français PGI/progiciel de gestion intégré), ces derniers étant globalement plus orientés vers la gestion backend de l’entreprise.
Cette page se concentre sur les CRM libres :
* CiviCRM, orienté associations d’une certaine taille et/ou dispersée géographiquement
* SugarCRM, très orienté pour les commerciaux (logiciel limite libre)
* SuiteCRM, fork récent de SugarCRM
* vtiger CRM, fork plus ancien de SugarCRM
* CremeCRM
* Dolibarr
* Odoo (anciennement OpenERP)
* Galette, orienté petites associations pour la gestion d’adhérents
== SugarCRM Community Edition ==
* Site : https://www.sugarcrm.com/
* Licence : AGPLv3 + conditions spécifiques non-libres à accepter y compris pour une installation locale (non-distribution des forks, sous-licenciement des données utilisateur, etc. = bizarre pour une installation locale, ça pourrait être justifié pour une installation hébergée/SaaS), nombreuses critiques sur le caractères (encore) libre de SugarCRM
* Modèle économique : open-core, support pour éditions payantes, version libre et gratuite maintenue au minimum
* Téléchargement : [http://sourceforge.net/projects/sugarcrm/files/ tarball sur SourceForge], pas de dépôt de gestion de version public ?
* Avis : très orienté commercial : contacts clients, prospects, email en masse, ROI, appels programmés
* Difficulté d’installation : relativement simple
* Difficulté de configuration : très peu de configuration initiale
* Difficulté de prise en main utilisateur : ''(non-suffisamment-testé-pour-avoir-un-avis)''
== SuiteCRM ==
* Site : https://suitecrm.com/
* Licence : AGPLv3
* Modèle économique : libre développé par une entreprise et une petite communauté, services et support payants, installation hébergée (SaaS) proposée
* Téléchargement : [https://suitecrm.com/download tarball], [https://github.com/salesagility/SuiteCRM dépôt Git]
* Avis : (similaire à SugarCRM) très orienté commercial : contacts clients, prospects, email en masse, ROI, appels programmés ; un peu moins joli et pratique que SugarCRM
* Difficulté d’installation : relativement simple
* Difficulté de configuration : très peu de configuration initiale
* Difficulté de prise en main utilisateur : ''(non-suffisamment-testé-pour-avoir-un-avis)''
== CiviCRM ==
* Site : https://civicrm.org/
* Licence : AGPLv3
* Modèle économique : libre développé par une communauté de taille moyenne et une entreprise, quelques consultants dans le monde entier, installations hébergées (SaaS) proposées
* Téléchargement : [https://civicrm.org/download/list tarball], [https://github.com/civicrm/civicrm-core dépôt Git]
* Avis : assez adapté à la cible (grosses associations et non-profits, surtout dispersées géographiquement), demande un temps d’adaptation pour comprendre les concepts de base, puissant (en fonction du temps passé à le configurer)
* Difficulté d’installation : pas trop compliquée
* Difficulté de configuration : pas trop compliqué, mais long ou demandant une certaine habitude
* Difficulté de prise en main utilisateur : une fois les concepts de base assimilés (4 h de formation ou quelques jours d’autoformation), les worflows semblent assez naturels
== Dolibarr ==
* Site : http://www.dolibarr.org/ et http://www.dolibarr.fr/
* Licence : GPLv3+
* Modèle économique : libre développé par une communauté de taille moyenne, soutenu par une fondation dédiée, marché payant de plugins, quelques installations hébergées (SaaS) proposées
* Téléchargement : [http://sourceforge.net/projects/dolibarr/files/ tarball], [https://github.com/Dolibarr/dolibarr dépôt Git]
* Avis :
* Difficulté d’installation : très facile (paquet Debian/Ubuntu)
* Difficulté de configuration : simple et graduel : 2 modules de base à configurer, puis possibilité de configurer plus finement les modules activés
* Difficulté de prise en main utilisateur : ''(à évaluer)''
2eec207664ec5ba144c34b1bc630863c34f3dbd5
Fichier:Synchronised-pages-en-1-Database.png
6
147
459
2015-10-04T09:10:31Z
Seb35
1
Screenshot of the WordPress plugin “[[WordPress plugin Synchronised Pages|Synchronised Pages]]” – first step out of three in the workflow.
* Licence: CC0
* Author: Seb35
wikitext
text/x-wiki
Screenshot of the WordPress plugin “[[WordPress plugin Synchronised Pages|Synchronised Pages]]” – first step out of three in the workflow.
* Licence: CC0
* Author: Seb35
5a1b0f84218a4ca42d243af18e0bb72f13893310
460
459
2015-10-04T09:34:23Z
Seb35
1
+cat
wikitext
text/x-wiki
Screenshot of the WordPress plugin “[[WordPress plugin Synchronised Pages|Synchronised Pages]]” – first step out of three in the workflow.
* Licence: CC0
* Author: Seb35
[[Category:WordPress]]
80025e1edca31cbb20c6735577ac40ea3285005f
462
460
2015-10-04T09:36:00Z
Seb35
1
+desc
wikitext
text/x-wiki
Screenshot of the WordPress plugin “[[WordPress plugin Synchronised Pages|Synchronised Pages]]” – first step out of three in the workflow: create the database of all your events/pages you want to create.
* Licence: CC0
* Author: Seb35
[[Category:WordPress]]
1a446299043d33c93a96d8bfe9da5d6ba8521034
Fichier:Synchronised-pages-en-2-Template.png
6
148
461
2015-10-04T09:35:19Z
Seb35
1
Screenshot of the WordPress plugin “[[WordPress plugin Synchronised Pages|Synchronised Pages]]” – second step out of three in the workflow: create the template for your future pages.
* Licence: CC0
* Author: Seb35
[[Category:WordPress]]
wikitext
text/x-wiki
Screenshot of the WordPress plugin “[[WordPress plugin Synchronised Pages|Synchronised Pages]]” – second step out of three in the workflow: create the template for your future pages.
* Licence: CC0
* Author: Seb35
[[Category:WordPress]]
fcd755f60ff5b173b18a72a256582671c898d1ca
Fichier:Synchronised-pages-en-3-Tool.png
6
149
463
2015-10-04T09:37:50Z
Seb35
1
Screenshot of the WordPress plugin “[[WordPress plugin Synchronised Pages|Synchronised Pages]]” – third step out of three in the workflow: launch the tool.
* Licence: CC0
* Author: Seb35
[[Category:WordPress]]
wikitext
text/x-wiki
Screenshot of the WordPress plugin “[[WordPress plugin Synchronised Pages|Synchronised Pages]]” – third step out of three in the workflow: launch the tool.
* Licence: CC0
* Author: Seb35
[[Category:WordPress]]
e9b122ccec26c7c46196fa243645cc204713a0c7
Fichier:Synchronised-pages-en-4-List-of-posts.png
6
150
464
2015-10-04T09:39:09Z
Seb35
1
Screenshot of the WordPress plugin “[[WordPress plugin Synchronised Pages|Synchronised Pages]]” – result: the list of generated posts in the admin view.
* Licence: CC0
* Author: Seb35
[[Category:WordPress]]
wikitext
text/x-wiki
Screenshot of the WordPress plugin “[[WordPress plugin Synchronised Pages|Synchronised Pages]]” – result: the list of generated posts in the admin view.
* Licence: CC0
* Author: Seb35
[[Category:WordPress]]
956515a0449f4a7ec0f3bf5304edfc080136ca25
Fichier:Synchronised-pages-en-5-Generated-posts.png
6
151
465
2015-10-04T09:40:40Z
Seb35
1
Screenshot of the WordPress plugin “[[WordPress plugin Synchronised Pages|Synchronised Pages]]” – result: the generated posts in the public view.
* Licence: CC0
* Author: Seb35
[[Category:WordPress]]
wikitext
text/x-wiki
Screenshot of the WordPress plugin “[[WordPress plugin Synchronised Pages|Synchronised Pages]]” – result: the generated posts in the public view.
* Licence: CC0
* Author: Seb35
[[Category:WordPress]]
d4df12a3a213ed92e0546c21653fa14b7457ac99
Catégorie:WordPress
14
152
466
2015-10-04T09:58:06Z
Seb35
1
Page créée avec « [[Catégorie:Racine]] »
wikitext
text/x-wiki
[[Catégorie:Racine]]
129a48f152ec5efbe3262fb58ee49b7b04112cb5
WordPress plugin Synchronised Pages
0
153
467
2015-10-04T09:59:21Z
Seb35
1
Description of my WordPress plugin Synchronised Pages
wikitext
text/x-wiki
The WordPress plugin “Synchronised Pages” empower you in creating a lot of pages according to a template in which you can remplace some parts of the template with specific informations contained in a database.
== Description ==
An easy way to describe this plugin is to give an example: imagine you want to create a small website for a festival in which each concert has specific hours, title, band/musicians, description… Without this plugin, you have to create by hand all the pages. With this plugin you can put all informations in a spreadsheet, create a template for the pages, and then automatically generate all the pages.
<gallery mode="packed" caption="The three steps of the workflow" heights="250px">
File:Synchronised-pages-en-1-Database.png|1. Create the database of all your events/pages you want to create
File:Synchronised-pages-en-2-Template.png|2. Create the template for your futures pages
File:Synchronised-pages-en-3-Tool.png|3. Launch the tool
</gallery>
<gallery mode="packed" caption="The result" heights="250px">
File:Synchronised-pages-en-4-List-of-posts.png|The list of generated posts in the admin view
File:Synchronised-pages-en-5-Generated-posts.png|The generated posts in the public view
</gallery>
== Installation ==
This section describes how to install the plugin and get it working.
# Upload the directory <code>synchronised-pages</code> in the <code>/wp-content/plugins/</code> directory
# Activate the plugin through the “Plugins” menu in WordPress
With default settings, you can only generate pages, not posts; you can change this setting in the menu Settings > Writing > Synchronised Pages.
== Frequently Asked Questions ==
=== Are the templates public? ===
No. They are similar to Private posts.
=== If some pages already exist, are they remplaced or re-created? ===
Currently, pages whose the title already exist are remplaced, so the old content is overwritten by the generated new content.
Possibly in the future, an option will give the choice.
== Changelog ==
=== 0.1 ===
Current version. Working and stable plugin, could be 1.0 but some parts of code should be rewritten.
[[Category:WordPress]]
5478f83d31b3a64e16f71569815b2efbc572c545
WordPress plugin Synchronised Pages
0
153
468
467
2015-10-04T10:55:40Z
Seb35
1
+download link, +1 faq, +Development
wikitext
text/x-wiki
The WordPress plugin “Synchronised Pages” empower you in creating a lot of pages according to a template in which you can remplace some parts of the template with specific informations contained in a database.
== Description ==
An easy way to describe this plugin is to give an example: imagine you want to create a small website for a festival in which each concert has specific hours, title, band/musicians, description… Without this plugin, you have to create by hand all the pages. With this plugin you can put all informations in a spreadsheet, create a template for the pages, and then automatically generate all the pages.
<gallery mode="packed" caption="The three steps of the workflow" heights="250px">
File:Synchronised-pages-en-1-Database.png|1. Create the database of all your events/pages you want to create
File:Synchronised-pages-en-2-Template.png|2. Create the template for your futures pages
File:Synchronised-pages-en-3-Tool.png|3. Launch the tool
</gallery>
<gallery mode="packed" caption="The result" heights="250px">
File:Synchronised-pages-en-4-List-of-posts.png|The list of generated posts in the admin view
File:Synchronised-pages-en-5-Generated-posts.png|The generated posts in the public view
</gallery>
== Installation ==
This section describes how to install the plugin and get it working.
# Download the code from GitHub: https://github.com/Seb35/Synchronised-Pages/archive/master.zip
# Upload the directory <code>synchronised-pages</code> in the <code>/wp-content/plugins/</code> directory
# Activate the plugin through the “Plugins” menu in WordPress
With default settings, you can only generate pages, not posts; you can change this setting in the menu Settings > Writing > Synchronised Pages.
== Frequently Asked Questions ==
=== Are the templates public? ===
No. They are similar to Private posts.
=== If some pages already exist, are they remplaced or re-created? ===
Currently, pages whose the title already exist are remplaced, so the old content is overwritten by the generated new content.
Possibly in the future, an option will give the choice.
=== Is it the same thing as “child pages”? ===
Not exactly. Child pages is a feature specific for the post type “Page” (not standard “Posts”) where you can say a given page is a child of some other page, it is useful to show a hierarchical list of pages. Here the synchronised pages are only similar in their layout. But if you want make that all synchronised pages have a parent page, it’s up to you to make it – you can automatically get the list of all synchronised pages from a given import.
== Changelog ==
=== 0.1 ===
Current version. Working and stable plugin, could be 1.0 but some parts of code should be rewritten.
== Development ==
Development is done on GitHub, in the repository [https://github.com/Seb35/Synchronised-Pages Seb35/Synchronised-Pages]. You can report bugs or ask features in the [https://github.com/Seb35/Synchronised-Pages/issues bug tracker], and if you are a developer you are welcome to submit [https://github.com/Seb35/Synchronised-Pages/pulls pull request].
Versions on GitHub will be send back to the officiel WordPress repository.
[[Category:WordPress]]
7a7995558f5018b52ce3b2707debb9a6b8df581e
469
468
2015-10-04T11:47:55Z
Seb35
1
+version 0.2.0 (public)
wikitext
text/x-wiki
The WordPress plugin “Synchronised Pages” empower you in creating a lot of pages according to a template in which you can remplace some parts of the template with specific informations contained in a database.
== Description ==
An easy way to describe this plugin is to give an example: imagine you want to create a small website for a festival in which each concert has specific hours, title, band/musicians, description… Without this plugin, you have to create by hand all the pages. With this plugin you can put all informations in a spreadsheet, create a template for the pages, and then automatically generate all the pages.
<gallery mode="packed" caption="The three steps of the workflow" heights="250px">
File:Synchronised-pages-en-1-Database.png|1. Create the database of all your events/pages you want to create
File:Synchronised-pages-en-2-Template.png|2. Create the template for your futures pages
File:Synchronised-pages-en-3-Tool.png|3. Launch the tool
</gallery>
<gallery mode="packed" caption="The result" heights="250px">
File:Synchronised-pages-en-4-List-of-posts.png|The list of generated posts in the admin view
File:Synchronised-pages-en-5-Generated-posts.png|The generated posts in the public view
</gallery>
== Installation ==
This section describes how to install the plugin and get it working.
# Download the code from GitHub: https://github.com/Seb35/Synchronised-Pages/archive/master.zip
# Upload the directory <code>synchronised-pages</code> in the <code>/wp-content/plugins/</code> directory
# Activate the plugin through the “Plugins” menu in WordPress
With default settings, you can only generate pages, not posts; you can change this setting in the menu Settings > Writing > Synchronised Pages.
== Frequently Asked Questions ==
=== Are the templates public? ===
No. They are similar to Private posts.
=== If some pages already exist, are they remplaced or re-created? ===
Currently, pages whose the title already exist are remplaced, so the old content is overwritten by the generated new content.
Possibly in the future, an option will give the choice.
=== Is it the same thing as “child pages”? ===
Not exactly. Child pages is a feature specific for the post type “Page” (not standard “Posts”) where you can say a given page is a child of some other page, it is useful to show a hierarchical list of pages. Here the synchronised pages are only similar in their layout. But if you want make that all synchronised pages have a parent page, it’s up to you to make it – you can automatically get the list of all synchronised pages from a given import.
== Changelog ==
=== 0.2 ===
Beta version. First public version.
=== 0.1 ===
Current version. Working and stable plugin, could be 1.0 but some parts of code should be rewritten.
== Development ==
Development is done on GitHub, in the repository [https://github.com/Seb35/Synchronised-Pages Seb35/Synchronised-Pages]. You can report bugs or ask features in the [https://github.com/Seb35/Synchronised-Pages/issues bug tracker], and if you are a developer you are welcome to submit [https://github.com/Seb35/Synchronised-Pages/pulls pull request].
Versions on GitHub will be send back to the officiel WordPress repository.
[[Category:WordPress]]
f0556771a8a8e62a806cbc1b8323cfa742953719
Accueil
0
1
560
457
2016-07-16T15:43:29Z
Seb35
1
+lien pour télécharger cette page avec Git
wikitext
text/x-wiki
Ce wiki me sert de base de connaissance dans le cadre des activités de [[:seb35:|mon entreprise]].
Il peut comporter des pages de contenu ou simplement des liens vers d’autres sites pour les activités collaboratives. Vous pouvez vous créer un compte si vous voulez discuter ou modifier une erreur. (En fait, j’ai désactivé l’inscription à cause du spam.)
Vous pouvez [[Extension:GitSynchro|télécharger l’historique de cette page avec Git]] :
:<code>git clone <nowiki>http://wiki.seb35.fr/Accueil</nowiki></code>
== Pages du wiki ==
=== Tutoriaux ===
* [[Tutorial:Beautiful MediaWiki URLs]]
* [[Tutorial:Packaging de WebApps]]
=== Autres ===
* [[Présentation:Wikis]]
* [[CRM]] (comparaison de CRMs libres)
* [[Archéo Lex]]
* [[Syntaxes de formatage léger]]
* [[Log/Seb35]]
* [[MediaWiki]]
d51be7fbc95baf86cf7b3260af766bd4a941a354
577
560
2016-12-03T12:22:48Z
Seb35
1
+Special:Version
wikitext
text/x-wiki
Ce wiki me sert de base de connaissance dans le cadre des activités de [[:seb35:|mon entreprise]].
Il peut comporter des pages de contenu ou simplement des liens vers d’autres sites pour les activités collaboratives. Vous pouvez vous créer un compte si vous voulez discuter ou modifier une erreur. (En fait, j’ai désactivé l’inscription à cause du spam.)
Vous pouvez [[Extension:GitSynchro|télécharger l’historique de cette page avec Git]] :
:<code>git clone <nowiki>http://wiki.seb35.fr/Accueil</nowiki></code>
== Pages du wiki ==
[[Special:Version]]
=== Tutoriaux ===
* [[Tutorial:Beautiful MediaWiki URLs]]
* [[Tutorial:Packaging de WebApps]]
=== Autres ===
* [[Présentation:Wikis]]
* [[CRM]] (comparaison de CRMs libres)
* [[Archéo Lex]]
* [[Syntaxes de formatage léger]]
* [[Log/Seb35]]
* [[MediaWiki]]
c5946dc3602736b8390e731fbeef4fb59f887281
167798
577
2019-02-02T17:14:54Z
Seb35
1
/* Pages du wiki */
wikitext
text/x-wiki
Ce wiki me sert de base de connaissance dans le cadre des activités de [[:seb35:|mon entreprise]].
Il peut comporter des pages de contenu ou simplement des liens vers d’autres sites pour les activités collaboratives. Vous pouvez vous créer un compte si vous voulez discuter ou modifier une erreur. (En fait, j’ai désactivé l’inscription à cause du spam.)
Vous pouvez [[Extension:GitSynchro|télécharger l’historique de cette page avec Git]] :
:<code>git clone <nowiki>http://wiki.seb35.fr/Accueil</nowiki></code>
== Pages du wiki ==
[[Special:Version]]
=== Tutoriaux ===
* [[Tutorial:Beautiful MediaWiki URLs]]
* [[Tutorial:Packaging de WebApps]]
=== Autres ===
* [[Présentation:Wikis]]
* [[CRM]] (comparaison de CRMs libres)
* [[Archéo Lex]]
* [[Syntaxes de formatage léger]]
* [[Log/Seb35]]
* [[MediaWiki]]
=== Technique ===
* [[Btrfs]] (technique, en anglais)
cd9da6c3c82e7a77ed5d859f614ef2c7483c7d8f
167800
167798
2019-02-02T17:15:00Z
Seb35
1
/* Technique */
wikitext
text/x-wiki
Ce wiki me sert de base de connaissance dans le cadre des activités de [[:seb35:|mon entreprise]].
Il peut comporter des pages de contenu ou simplement des liens vers d’autres sites pour les activités collaboratives. Vous pouvez vous créer un compte si vous voulez discuter ou modifier une erreur. (En fait, j’ai désactivé l’inscription à cause du spam.)
Vous pouvez [[Extension:GitSynchro|télécharger l’historique de cette page avec Git]] :
:<code>git clone <nowiki>http://wiki.seb35.fr/Accueil</nowiki></code>
== Pages du wiki ==
[[Special:Version]]
=== Tutoriaux ===
* [[Tutorial:Beautiful MediaWiki URLs]]
* [[Tutorial:Packaging de WebApps]]
=== Autres ===
* [[Présentation:Wikis]]
* [[CRM]] (comparaison de CRMs libres)
* [[Archéo Lex]]
* [[Syntaxes de formatage léger]]
* [[Log/Seb35]]
* [[MediaWiki]]
=== Technique ===
* [[Btrfs]] (en anglais)
6cf40bd10e68c47ed3c654f585b8477433d8d85f
429789
167800
2019-09-11T21:26:49Z
Seb35
1
/* Technique */
wikitext
text/x-wiki
Ce wiki me sert de base de connaissance dans le cadre des activités de [[:seb35:|mon entreprise]].
Il peut comporter des pages de contenu ou simplement des liens vers d’autres sites pour les activités collaboratives. Vous pouvez vous créer un compte si vous voulez discuter ou modifier une erreur. (En fait, j’ai désactivé l’inscription à cause du spam.)
Vous pouvez [[Extension:GitSynchro|télécharger l’historique de cette page avec Git]] :
:<code>git clone <nowiki>http://wiki.seb35.fr/Accueil</nowiki></code>
== Pages du wiki ==
[[Special:Version]]
=== Tutoriaux ===
* [[Tutorial:Beautiful MediaWiki URLs]]
* [[Tutorial:Packaging de WebApps]]
=== Autres ===
* [[Présentation:Wikis]]
* [[CRM]] (comparaison de CRMs libres)
* [[Archéo Lex]]
* [[Syntaxes de formatage léger]]
* [[Log/Seb35]]
* [[MediaWiki]]
=== Technique ===
* [[Btrfs]] (en anglais)
* [[Unicode]]
d962b6fd8ec8e2e880851a37c74f187738bf1242
543924
429789
2019-11-21T03:15:12Z
109.126.199.176
0
Лучшие идеи бизнеса и заработка денег
wikitext
text/x-wiki
Это хороший сайт
655e4041ad989a2d2c7af71a44066426051bbf57
590755
543924
2019-12-26T12:07:58Z
31.28.204.60
0
Лучшие идеи бизнеса и заработка денег
wikitext
text/x-wiki
Узнайте на сайте
d5c2efef75a7d93532cd50e5dc1e975f936fa79e
658075
590755
2020-03-07T16:21:44Z
Seb35
1
revert
wikitext
text/x-wiki
Ce wiki me sert de base de connaissance dans le cadre des activités de [[:seb35:|mon entreprise]].
Il peut comporter des pages de contenu ou simplement des liens vers d’autres sites pour les activités collaboratives. Vous pouvez vous créer un compte si vous voulez discuter ou modifier une erreur. (En fait, j’ai désactivé l’inscription à cause du spam.)
Vous pouvez [[Extension:GitSynchro|télécharger l’historique de cette page avec Git]] :
:<code>git clone <nowiki>http://wiki.seb35.fr/Accueil</nowiki></code>
== Pages du wiki ==
[[Special:Version]]
=== Tutoriaux ===
* [[Tutorial:Beautiful MediaWiki URLs]]
* [[Tutorial:Packaging de WebApps]]
=== Autres ===
* [[Présentation:Wikis]]
* [[CRM]] (comparaison de CRMs libres)
* [[Archéo Lex]]
* [[Syntaxes de formatage léger]]
* [[Log/Seb35]]
* [[MediaWiki]]
=== Technique ===
* [[Btrfs]] (en anglais)
* [[Unicode]]
d962b6fd8ec8e2e880851a37c74f187738bf1242
Extension:GitSynchro
0
161
561
2016-07-16T16:35:10Z
Seb35
1
explication du raisonnement, avancement, idées prospectives
wikitext
text/x-wiki
Cette extension '''GitSynchro''', que je suis en train de développer, a pour but de télécharger et de téléverser les pages d’un wiki MediaWiki au travers de [[:wikipedia:fr:Git]].
La raison sous-jacente à cette extension est la possibilité d’éditer hors-ligne un wiki, puis de téléverser sur le wiki en-ligne dès que la connexion Internet est retrouvée. Pour en avoir discuté avec plusieurs personnes, cette fonctionnalité d’« édition hors-ligne » peut combler un certain besoin, mais les avis divergent sur les usages qu’il faudrait en avoir.
Vu que cette fonctionnalité n’existe pas, cette extension apporte une possibilité technique. Ensuite, elle devra être testée en conditions réelles et les workflows devront probablement être ajustés. Noter également que Git n’est pas un logiciel très user-friendly mais les technologies sous-jacentes sont assez puissantes, aussi « l’édition hors-ligne » ne se fera probablement pas directement avec Git (sauf pour les personnes expérimentées), mais au moyen d’interfaces graphiques exploitant Git en interne pour les aspects stockage local et synchronisation distante.
== Exemple ==
Accès en lecture seule :
:<code>git clone http://wiki.seb35.fr/Extension:GitSynchro</code>
== Avancement ==
* <s>Lecture</s>
* Écriture
** Authentification avec l’extension auth_request de nginx
*** <s>Création d’un module à ajouter à l’API renvoyant 200/401/403 selon si la requête est ok/mauvaise authentification/interdite</s>
*** Utilisation de AuthManager pour se connecter au moyen de l’API clientlogin pour récupérer un jeton qui sera utilisé par le hook Git qui fera l’écriture au moyen de l’API edit
** Hook Git réalisant l’écriture effective dans MediaWiki des commits reçus
*** Le hook Git le plus adapté est amha [https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks update] pour avoir une possibilité de refuser en cas de conflit d’édition
*** Édition au moyen de l’API edit en récupérant le nom du serveur dans l’adresse "email" du committer, mais pour cela il faut récupérer à un moment donné le mot de passe du committer (qu’il a entré lors du push) ou un jeton émis à la suite de l’authentification du push
* Création d’un hook client Git prepare-commit-msg destiné à formater très exactement le message de commit, car s’il n’est pas exactement conforme à ce que le serveur crée de son côté il faudra que le serveur le modifie et crée un commit différent, ce qui ferait diverger à chaque push le client et le serveur
*: Dans cette même logique, il faut que le client ait accès à l’ensemble des informations nécessaires à la création d’un commit ; par exemple, j’avais envisagé d’inscrire le numéro de la révision MediaWiki dans le message de commit, mais le client n’a pas cette information ; en revanche, il serait éventuellement possible, si cela a un intérêt, d’inscrire l’identifiant interne du texte committé, qui est simplement le SHA1 du texte, donc connu du client
== Git flavour ==
J’ai déjà eu l’occasion de créer une passerelle Git – cf [https://archeo-lex.fr Archéo Lex] visant à publier la loi française sous Git – et, une fois la technique de base achevée, de nombreuses questions apparaissent sur la façon d’organiser les choses, et de façon sous-jacente les workflows et les usages. Dans Archéo Lex, je citerai deux exemples :
* en légistique française, il y a certains textes qui n’ont pas encore de date de publication (car en attente d’un décret, etc.), mais Git n’a pas cette notion de « date inconnue à déterminer ultérieurement », il faut donc définir une convention
* les lois peuvent être toutes rangées dans un seul répertoire à raison d’un fichier par loi, mais Git ne sait pas avoir plusieurs historiques distincts dans un seul répertoire ; donc il faut un répertoire par loi, mais met-on un seul fichier dans ce répertoire ou fait-on des sous-répertoires par livre, section, article ? Rassemble-t-on l’ensemble des lois dans un répertoire principal versionné avec des sous-modules Git ? (ou d’autres technologies Git de séparation d’historique comme les subtrees ou les subrepos)
Ici, il est probable qu’un repo Git corresponde à un article avec son historique propre, et donc en conséquence un sous-dossier par article, chaque sous-dossier contenant un unique fichier.
Le format du message de commit devra être arrêté, en tenant compte des diverses contraintes ; il peut y avoir plusieurs formats potentiels, mais un seul par wiki.
Ensuite, la première difficulté d’organisation et d’utilisation viendra lorsqu’il faudra gérer plusieurs articles. Les interfaces graphiques prendront probablement en charge la synchronisation sous-jacente des historiques. En ligne de commande, il faudra probablement créer une commande permettant de visualiser l’état de la synchronisation d’un ensemble de fichiers/articles.
66d2b42656f8a3c1f410f933d0d64701e297cc09
562
561
2016-07-16T16:37:36Z
Seb35
1
un autre commit
wikitext
text/x-wiki
Cette extension '''GitSynchro''', que je suis en train de développer, a pour but de télécharger et de téléverser les pages d’un wiki MediaWiki au travers de [[:wikipedia:fr:Git]].
La raison sous-jacente à cette extension est la possibilité d’éditer hors-ligne un wiki, puis de téléverser sur le wiki en-ligne dès que la connexion Internet est retrouvée. Pour en avoir discuté avec plusieurs personnes, cette fonctionnalité d’« édition hors-ligne » peut combler un certain besoin, mais les avis divergent sur les usages qu’il faudrait en avoir.
Vu que cette fonctionnalité n’existe pas, cette extension apporte une possibilité technique. Ensuite, elle devra être testée en conditions réelles et les workflows devront probablement être ajustés. Noter également que Git n’est pas un logiciel très user-friendly mais les technologies sous-jacentes sont assez puissantes, aussi « l’édition hors-ligne » ne se fera probablement pas directement avec Git (sauf pour les personnes expérimentées), mais au moyen d’interfaces graphiques exploitant Git en interne pour les aspects stockage local et synchronisation distante.
== Exemple ==
Accès en lecture seule :
:<code>git clone <nowiki>http://wiki.seb35.fr/Extension:GitSynchro</nowiki></code>
== Avancement ==
* <s>Lecture</s>
* Écriture
** Authentification avec l’extension auth_request de nginx
*** <s>Création d’un module à ajouter à l’API renvoyant 200/401/403 selon si la requête est ok/mauvaise authentification/interdite</s>
*** Utilisation de AuthManager pour se connecter au moyen de l’API clientlogin pour récupérer un jeton qui sera utilisé par le hook Git qui fera l’écriture au moyen de l’API edit
** Hook Git réalisant l’écriture effective dans MediaWiki des commits reçus
*** Le hook Git le plus adapté est amha [https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks update] pour avoir une possibilité de refuser en cas de conflit d’édition
*** Édition au moyen de l’API edit en récupérant le nom du serveur dans l’adresse "email" du committer, mais pour cela il faut récupérer à un moment donné le mot de passe du committer (qu’il a entré lors du push) ou un jeton émis à la suite de l’authentification du push
* Création d’un hook client Git prepare-commit-msg destiné à formater très exactement le message de commit, car s’il n’est pas exactement conforme à ce que le serveur crée de son côté il faudra que le serveur le modifie et crée un commit différent, ce qui ferait diverger à chaque push le client et le serveur
*: Dans cette même logique, il faut que le client ait accès à l’ensemble des informations nécessaires à la création d’un commit ; par exemple, j’avais envisagé d’inscrire le numéro de la révision MediaWiki dans le message de commit, mais le client n’a pas cette information ; en revanche, il serait éventuellement possible, si cela a un intérêt, d’inscrire l’identifiant interne du texte committé, qui est simplement le SHA1 du texte, donc connu du client
== Git flavour ==
J’ai déjà eu l’occasion de créer une passerelle Git – cf [https://archeo-lex.fr Archéo Lex] visant à publier la loi française sous Git – et, une fois la technique de base achevée, de nombreuses questions apparaissent sur la façon d’organiser les choses, et de façon sous-jacente les workflows et les usages. Dans Archéo Lex, je citerai deux exemples :
* en légistique française, il y a certains textes qui n’ont pas encore de date de publication (car en attente d’un décret, etc.), mais Git n’a pas cette notion de « date inconnue à déterminer ultérieurement », il faut donc définir une convention
* les lois peuvent être toutes rangées dans un seul répertoire à raison d’un fichier par loi, mais Git ne sait pas avoir plusieurs historiques distincts dans un seul répertoire ; donc il faut un répertoire par loi, mais met-on un seul fichier dans ce répertoire ou fait-on des sous-répertoires par livre, section, article ? Rassemble-t-on l’ensemble des lois dans un répertoire principal versionné avec des sous-modules Git ? (ou d’autres technologies Git de séparation d’historique comme les subtrees ou les subrepos)
Ici, il est probable qu’un repo Git corresponde à un article avec son historique propre, et donc en conséquence un sous-dossier par article, chaque sous-dossier contenant un unique fichier.
Le format du message de commit devra être arrêté, en tenant compte des diverses contraintes ; il peut y avoir plusieurs formats potentiels, mais un seul par wiki.
Ensuite, la première difficulté d’organisation et d’utilisation viendra lorsqu’il faudra gérer plusieurs articles. Les interfaces graphiques prendront probablement en charge la synchronisation sous-jacente des historiques. En ligne de commande, il faudra probablement créer une commande permettant de visualiser l’état de la synchronisation d’un ensemble de fichiers/articles.
58d957565e65c1e66494b748923860bb029107eb
MediaWikiFarm static analysis
0
162
566
2016-11-20T21:02:13Z
Seb35
1
Page créée avec « {| class="wikitable" |- ! rowspan="3" colspan="2" | Time ↧<br /><span style="font-weight:normal;"> <span id="link-mode-monoversion">Monoversion</span> / <span id="link-m... »
wikitext
text/x-wiki
{| class="wikitable"
|-
! rowspan="3" colspan="2" | Time ↧<br /><span style="font-weight:normal;">
<span id="link-mode-monoversion">Monoversion</span> / <span id="link-mode-multiversion" class="link-selected">Multiversion</span><br />
<span id="link-cache-no">No cache</span> / <span id="link-cache-empty" class="link-selected">Empty</span> / <span id="link-cache-loaded">Loaded</span><br />
<span id="link-deployment-with" class="link-selected">With</span> / <span id="link-deployment-without">Without</span> deployment file<br />
<span id="link-env-web" class="link-selected">Web</span> / <span id="link-env-cli">CLI</span> / <span id="link-env-update">update</span><br />
<span id="link-all">(All)</span> - As of [https://phabricator.wikimedia.org/rEMWF1b151729d9eee8feae601c6b0fc20469c8b86117 1b15172]
</span>
! colspan="16" | Properties
! colspan="9" | Files
|-
| rowspan="2" style="transform:rotate(-90deg) translate(-0.9em); max-width:2.4em; width:2.4em;" | farmDir
| rowspan="2" style="transform:rotate(-90deg) translate(-1.3em); max-width:2.4em; width:2.4em;" | configDir
| rowspan="2" style="transform:rotate(-90deg) translate(-0.9em); max-width:2.4em; width:2.4em;" | codeDir
| rowspan="2" style="transform:rotate(-90deg) translate(-1.15em); max-width:2.4em; width:2.4em;" | cacheDir
| colspan="2" style="text-align:center;" | params
| colspan="4" style="text-align:center;" | farmConfig
| colspan="3" style="text-align:center;" | variables
| colspan="3" style="text-align:center;" | configuration
| rowspan="2" style="transform:rotate(-90deg) translate(-1.5em); max-width:2.4em; width:2.4em;" | farms.yml
| rowspan="2" style="transform:rotate(-90deg) translate(-2.2em); max-width:2.4em; width:2.4em;" | variable.yml
| rowspan="2" style="transform:rotate(-90deg) translate(-1.5em); max-width:2.4em; width:2.4em;" | config.yml
| rowspan="2" style="transform:rotate(-90deg) translate(-2.1em); max-width:2.4em; width:2.4em;" | versions.yml
| rowspan="2" style="transform:rotate(-90deg) translate(-3.3em); max-width:2.4em; width:2.4em;" | deployments.php
| rowspan="2" style="transform:rotate(-90deg) translate(-4.0em); max-width:2.4em; width:2.4em;" | (cache) versions.php
| rowspan="2" style="transform:rotate(-90deg) translate(-3.5em); max-width:2.4em; width:2.4em;" | (cache) config.php
| rowspan="2" style="transform:rotate(-90deg) translate(-5.4em); max-width:2.4em; width:2.4em; height:13.5em;" | (cache) LocalSettings.php
| rowspan="2" style="transform:rotate(-90deg) translate(-1.4em); max-width:2.4em; width:2.4em; height:13.5em;" | main.php
|-
| style="transform:rotate(-90deg) translate(-1.4em); max-width:2.4em; width:2.4em;" | 'EntryPoint'
| style="transform:rotate(-90deg) translate(-3.5em); max-width:2.4em; width:2.4em; height:10em;" | 'ExtensionRegistry'
| style="transform:rotate(-90deg) translate(-1.0em); max-width:2.4em; width:2.4em;" | 'variables'
| style="transform:rotate(-90deg) translate(-2.0em); max-width:2.4em; width:2.4em;" | 'coreconfig'
| style="transform:rotate(-90deg) translate(-0.1em); max-width:2.4em; width:2.4em;" | 'config'
| style="transform:rotate(-90deg) translate( 0.3em); max-width:2.4em; width:2.4em;" | Other
| style="transform:rotate(-90deg) translate(-1.2em); max-width:2.4em; width:2.4em;" | '$CODE'
| style="transform:rotate(-90deg) translate(-2.1em); max-width:2.4em; width:2.4em;" | '$VERSION'
| style="transform:rotate(-90deg) translate(-0.5em); max-width:2.4em; width:2.4em;" | Other
| style="transform:rotate(-90deg) translate(-3.5em); max-width:2.4em; width:2.4em;" | 'settings' / 'arrays'
| style="transform:rotate(-90deg) translate(-3.8em); max-width:2.4em; width:2.4em;" | 'extensions' / 'skins'
| style="transform:rotate(-90deg) translate(-1.5em); max-width:2.4em; width:2.4em;" | 'execFiles'
|-
| rowspan="11" style="transform:rotate(-90deg) translate(-1.4em); max-width:1.5em;" | Existence
| <code>load</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;">↳</span> <code>__construct</code>
| style="text-align:center;" | {{set}}
| style="text-align:center;" | {{set}}
| style="text-align:center;" | {{set}}
| style="text-align:center;" | {{set}}
| style="text-align:center;" | {{set}}
| style="text-align:center;" | {{set}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | {{set}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | {{set}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{read}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;">| ↳</span> <code>selectFarm</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;">↳</span> <code>checkExistence</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{read}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;">| ↳</span> <code>checkHostVariables</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;">| ↳</span> <code>setVersion</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="hide-when-cache-loaded">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | <span class="hide-when-cache-loaded">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="hide-when-cache-loaded">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="hide-when-cache-loaded hide-when-mode-monoversion">{{set}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span><span class="hide-when-cache-loaded hide-when-mode-multiversion">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="hide-when-cache-loaded">{{set}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | <span class="hide-when-cache-loaded">{{set}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | <span class="hide-when-cache-loaded">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="hide-when-cache-loaded hide-when-mode-monoversion">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span><span class="hide-when-cache-loaded hide-when-mode-multiversion">{{-}}</span>
| style="text-align:center;" | <span class="hide-when-cache-loaded hide-when-mode-monoversion">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span><span class="hide-when-cache-loaded hide-when-mode-multiversion">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;">| ↳</span> <code>setOtherVariables</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;">↳</span> <code>getConfigFile</code>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <code>setVariable</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <code>updateVersionAfterMaintenance</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{read}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <code>updateVersion</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="hide-when-deployment-without hide-when-mode-monoversion">{{read}}</span><span class="deployment-default-hide show-when-deployment-without void">{{-}}</span><span class="hide-when-deployment-without hide-when-mode-multiversion">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="mode-default-hide show-when-mode-multiversion">{{read}}</span><span class="mode-default-show hide-when-mode-multiversion void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="hide-when-deployment-without hide-when-mode-monoversion">{{set}}</span><span class="deployment-default-hide show-when-deployment-without void">{{-}}</span><span class="hide-when-deployment-without hide-when-mode-multiversion">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| rowspan="6" style="transform:rotate(-90deg) translate(-2.5em); max-width:1.5em;" | Configuration
| <code>loadMediaWikiConfig</code>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;">↳</span> <code>getMediaWikiConfig</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;"> ↳</span> <code>populateSettings</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;"> ↳</span> <code>extractSkinsAndExtensions</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;"> | ↳</span> <code>detectLoadingMechanism</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;"> ↳</span> <code>createLocalSettings</code>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| rowspan="4" style="transform:rotate(-90deg) translate(-0.55em); max-width:1.5em;" | Utility
| <code>isLocalSettingsFresh</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{read}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-empty show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-empty hide-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <code>replaceVariable</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{read}}
| style="text-align:center;" | {{read}}
| style="text-align:center;" | {{read}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <code>readFile</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{read}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <code>cacheFile</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| colspan="2" | (MediaWiki)
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | <span class="hide-when-cache-loaded">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span>
|}
8157f0250dd243354d4f1dd130343e29896f12d3
573
566
2016-11-20T21:36:32Z
Seb35
1
+explanations
wikitext
text/x-wiki
([[#Explanations (English)|explanation below]] - [[#Explications (français)|explications ci-dessous)]]
{| class="wikitable"
|-
! rowspan="3" colspan="2" | Time ↧<br /><span style="font-weight:normal;">
<span id="link-mode-monoversion">Monoversion</span> / <span id="link-mode-multiversion" class="link-selected">Multiversion</span><br />
<span id="link-cache-no">No cache</span> / <span id="link-cache-empty" class="link-selected">Empty</span> / <span id="link-cache-loaded">Loaded</span><br />
<span id="link-deployment-with" class="link-selected">With</span> / <span id="link-deployment-without">Without</span> deployment file<br />
<span id="link-env-web" class="link-selected">Web</span> / <span id="link-env-cli">CLI</span> / <span id="link-env-update">update</span><br />
<span id="link-all">(All)</span> - As of [https://phabricator.wikimedia.org/rEMWF1b151729d9eee8feae601c6b0fc20469c8b86117 1b15172]
</span>
! colspan="16" | Properties
! colspan="9" | Files
|-
| rowspan="2" style="transform:rotate(-90deg) translate(-0.9em); max-width:2.4em; width:2.4em;" | farmDir
| rowspan="2" style="transform:rotate(-90deg) translate(-1.3em); max-width:2.4em; width:2.4em;" | configDir
| rowspan="2" style="transform:rotate(-90deg) translate(-0.9em); max-width:2.4em; width:2.4em;" | codeDir
| rowspan="2" style="transform:rotate(-90deg) translate(-1.15em); max-width:2.4em; width:2.4em;" | cacheDir
| colspan="2" style="text-align:center;" | params
| colspan="4" style="text-align:center;" | farmConfig
| colspan="3" style="text-align:center;" | variables
| colspan="3" style="text-align:center;" | configuration
| rowspan="2" style="transform:rotate(-90deg) translate(-1.5em); max-width:2.4em; width:2.4em;" | farms.yml
| rowspan="2" style="transform:rotate(-90deg) translate(-2.2em); max-width:2.4em; width:2.4em;" | variable.yml
| rowspan="2" style="transform:rotate(-90deg) translate(-1.5em); max-width:2.4em; width:2.4em;" | config.yml
| rowspan="2" style="transform:rotate(-90deg) translate(-2.1em); max-width:2.4em; width:2.4em;" | versions.yml
| rowspan="2" style="transform:rotate(-90deg) translate(-3.3em); max-width:2.4em; width:2.4em;" | deployments.php
| rowspan="2" style="transform:rotate(-90deg) translate(-4.0em); max-width:2.4em; width:2.4em;" | (cache) versions.php
| rowspan="2" style="transform:rotate(-90deg) translate(-3.5em); max-width:2.4em; width:2.4em;" | (cache) config.php
| rowspan="2" style="transform:rotate(-90deg) translate(-5.4em); max-width:2.4em; width:2.4em; height:13.5em;" | (cache) LocalSettings.php
| rowspan="2" style="transform:rotate(-90deg) translate(-1.4em); max-width:2.4em; width:2.4em; height:13.5em;" | main.php
|-
| style="transform:rotate(-90deg) translate(-1.4em); max-width:2.4em; width:2.4em;" | 'EntryPoint'
| style="transform:rotate(-90deg) translate(-3.5em); max-width:2.4em; width:2.4em; height:10em;" | 'ExtensionRegistry'
| style="transform:rotate(-90deg) translate(-1.0em); max-width:2.4em; width:2.4em;" | 'variables'
| style="transform:rotate(-90deg) translate(-2.0em); max-width:2.4em; width:2.4em;" | 'coreconfig'
| style="transform:rotate(-90deg) translate(-0.1em); max-width:2.4em; width:2.4em;" | 'config'
| style="transform:rotate(-90deg) translate( 0.3em); max-width:2.4em; width:2.4em;" | Other
| style="transform:rotate(-90deg) translate(-1.2em); max-width:2.4em; width:2.4em;" | '$CODE'
| style="transform:rotate(-90deg) translate(-2.1em); max-width:2.4em; width:2.4em;" | '$VERSION'
| style="transform:rotate(-90deg) translate(-0.5em); max-width:2.4em; width:2.4em;" | Other
| style="transform:rotate(-90deg) translate(-3.5em); max-width:2.4em; width:2.4em;" | 'settings' / 'arrays'
| style="transform:rotate(-90deg) translate(-3.8em); max-width:2.4em; width:2.4em;" | 'extensions' / 'skins'
| style="transform:rotate(-90deg) translate(-1.5em); max-width:2.4em; width:2.4em;" | 'execFiles'
|-
| rowspan="11" style="transform:rotate(-90deg) translate(-1.4em); max-width:1.5em;" | Existence
| <code>load</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;">↳</span> <code>__construct</code>
| style="text-align:center;" | {{set}}
| style="text-align:center;" | {{set}}
| style="text-align:center;" | {{set}}
| style="text-align:center;" | {{set}}
| style="text-align:center;" | {{set}}
| style="text-align:center;" | {{set}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | {{set}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | {{set}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{read}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;">| ↳</span> <code>selectFarm</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;">↳</span> <code>checkExistence</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{read}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;">| ↳</span> <code>checkHostVariables</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;">| ↳</span> <code>setVersion</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="hide-when-cache-loaded">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | <span class="hide-when-cache-loaded">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="hide-when-cache-loaded">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="hide-when-cache-loaded hide-when-mode-monoversion">{{set}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span><span class="hide-when-cache-loaded hide-when-mode-multiversion">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="hide-when-cache-loaded">{{set}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | <span class="hide-when-cache-loaded">{{set}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | <span class="hide-when-cache-loaded">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="hide-when-cache-loaded hide-when-mode-monoversion">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span><span class="hide-when-cache-loaded hide-when-mode-multiversion">{{-}}</span>
| style="text-align:center;" | <span class="hide-when-cache-loaded hide-when-mode-monoversion">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span><span class="hide-when-cache-loaded hide-when-mode-multiversion">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;">| ↳</span> <code>setOtherVariables</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;">↳</span> <code>getConfigFile</code>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <code>setVariable</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <code>updateVersionAfterMaintenance</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{read}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <code>updateVersion</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="hide-when-deployment-without hide-when-mode-monoversion">{{read}}</span><span class="deployment-default-hide show-when-deployment-without void">{{-}}</span><span class="hide-when-deployment-without hide-when-mode-multiversion">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="mode-default-hide show-when-mode-multiversion">{{read}}</span><span class="mode-default-show hide-when-mode-multiversion void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="hide-when-deployment-without hide-when-mode-monoversion">{{set}}</span><span class="deployment-default-hide show-when-deployment-without void">{{-}}</span><span class="hide-when-deployment-without hide-when-mode-multiversion">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| rowspan="6" style="transform:rotate(-90deg) translate(-2.5em); max-width:1.5em;" | Configuration
| <code>loadMediaWikiConfig</code>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;">↳</span> <code>getMediaWikiConfig</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;"> ↳</span> <code>populateSettings</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;"> ↳</span> <code>extractSkinsAndExtensions</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;"> | ↳</span> <code>detectLoadingMechanism</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;"> ↳</span> <code>createLocalSettings</code>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| rowspan="4" style="transform:rotate(-90deg) translate(-0.55em); max-width:1.5em;" | Utility
| <code>isLocalSettingsFresh</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{read}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-empty show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-empty hide-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <code>replaceVariable</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{read}}
| style="text-align:center;" | {{read}}
| style="text-align:center;" | {{read}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <code>readFile</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{read}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <code>cacheFile</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| colspan="2" | (MediaWiki)
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | <span class="hide-when-cache-loaded">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span>
|}
== Explanations (English) ==
This is a hand-made matrix describing what function read or modify what internal data for the software [https://phabricator.wikimedia.org/diffusion/EMWF/ MediaWikiFarm], a MediaWiki "extension" to manage MediaWiki farms of wikis.
This represents the class [https://phabricator.wikimedia.org/diffusion/EMWF/browse/master/src/MediaWikiFarm.php MediaWikiFarm], which is the main class containing almost all logic. Each row is a method (roughly sorted by chronological order in a typical run) and each column is a class property (all are protected). In each cell, there is either:
* {{read}}: the property is (only) read in the method;
* {{set}}: the property is set in the method (and possibly read);
* {{-}}: the property is neither read or set in the method.
In my previous <s>games</s> works on static analysis, I created [[:mw:File:Call graph of extension MediaWikiFarm.svg|the call graph]] with an external software. But, to be more exact, this call graph is only [[:wikipedia:Call graph|an overapproximation]] since the exact (dynamic) call graph is a subset of this one: in a run, possibly some paths are not executed since it depends on the context.
Here, this is the "data graph", and there are different contexts: on the top left, you can choose the various main contexts in which the software can run. This depends mainly from the environment and the configuration, and the possibilities are only the main ones.
The main result coming from this representation is: "the cache drastically reduces the processing". In fact this is not a surprise, it was designed for it, but such a sparse matrix is encouraging and help to visualise the inter-relations. When benchmarking the software, a no-cache run takes 10-15 milliseconds, and a with-cache run takes 85 microseconds (roughly 130 times less).
== Explications (français) ==
b04411424247a4a6d571ed783c2d4b95f0e49a3a
574
573
2016-11-20T23:03:25Z
Seb35
1
+fr
wikitext
text/x-wiki
([[#Explanations (English)|explanation below]] - [[#Explications (français)|explications ci-dessous)]]
{| class="wikitable"
|-
! rowspan="3" colspan="2" | Time ↧<br /><span style="font-weight:normal;">
<span id="link-mode-monoversion">Monoversion</span> / <span id="link-mode-multiversion" class="link-selected">Multiversion</span><br />
<span id="link-cache-no">No cache</span> / <span id="link-cache-empty" class="link-selected">Empty</span> / <span id="link-cache-loaded">Loaded</span><br />
<span id="link-deployment-with" class="link-selected">With</span> / <span id="link-deployment-without">Without</span> deployment file<br />
<span id="link-env-web" class="link-selected">Web</span> / <span id="link-env-cli">CLI</span> / <span id="link-env-update">update</span><br />
<span id="link-all">(All)</span> - As of [https://phabricator.wikimedia.org/rEMWF1b151729d9eee8feae601c6b0fc20469c8b86117 1b15172]
</span>
! colspan="16" | Properties
! colspan="9" | Files
|-
| rowspan="2" style="transform:rotate(-90deg) translate(-0.9em); max-width:2.4em; width:2.4em;" | farmDir
| rowspan="2" style="transform:rotate(-90deg) translate(-1.3em); max-width:2.4em; width:2.4em;" | configDir
| rowspan="2" style="transform:rotate(-90deg) translate(-0.9em); max-width:2.4em; width:2.4em;" | codeDir
| rowspan="2" style="transform:rotate(-90deg) translate(-1.15em); max-width:2.4em; width:2.4em;" | cacheDir
| colspan="2" style="text-align:center;" | params
| colspan="4" style="text-align:center;" | farmConfig
| colspan="3" style="text-align:center;" | variables
| colspan="3" style="text-align:center;" | configuration
| rowspan="2" style="transform:rotate(-90deg) translate(-1.5em); max-width:2.4em; width:2.4em;" | farms.yml
| rowspan="2" style="transform:rotate(-90deg) translate(-2.2em); max-width:2.4em; width:2.4em;" | variable.yml
| rowspan="2" style="transform:rotate(-90deg) translate(-1.5em); max-width:2.4em; width:2.4em;" | config.yml
| rowspan="2" style="transform:rotate(-90deg) translate(-2.1em); max-width:2.4em; width:2.4em;" | versions.yml
| rowspan="2" style="transform:rotate(-90deg) translate(-3.3em); max-width:2.4em; width:2.4em;" | deployments.php
| rowspan="2" style="transform:rotate(-90deg) translate(-4.0em); max-width:2.4em; width:2.4em;" | (cache) versions.php
| rowspan="2" style="transform:rotate(-90deg) translate(-3.5em); max-width:2.4em; width:2.4em;" | (cache) config.php
| rowspan="2" style="transform:rotate(-90deg) translate(-5.4em); max-width:2.4em; width:2.4em; height:13.5em;" | (cache) LocalSettings.php
| rowspan="2" style="transform:rotate(-90deg) translate(-1.4em); max-width:2.4em; width:2.4em; height:13.5em;" | main.php
|-
| style="transform:rotate(-90deg) translate(-1.4em); max-width:2.4em; width:2.4em;" | 'EntryPoint'
| style="transform:rotate(-90deg) translate(-3.5em); max-width:2.4em; width:2.4em; height:10em;" | 'ExtensionRegistry'
| style="transform:rotate(-90deg) translate(-1.0em); max-width:2.4em; width:2.4em;" | 'variables'
| style="transform:rotate(-90deg) translate(-2.0em); max-width:2.4em; width:2.4em;" | 'coreconfig'
| style="transform:rotate(-90deg) translate(-0.1em); max-width:2.4em; width:2.4em;" | 'config'
| style="transform:rotate(-90deg) translate( 0.3em); max-width:2.4em; width:2.4em;" | Other
| style="transform:rotate(-90deg) translate(-1.2em); max-width:2.4em; width:2.4em;" | '$CODE'
| style="transform:rotate(-90deg) translate(-2.1em); max-width:2.4em; width:2.4em;" | '$VERSION'
| style="transform:rotate(-90deg) translate(-0.5em); max-width:2.4em; width:2.4em;" | Other
| style="transform:rotate(-90deg) translate(-3.5em); max-width:2.4em; width:2.4em;" | 'settings' / 'arrays'
| style="transform:rotate(-90deg) translate(-3.8em); max-width:2.4em; width:2.4em;" | 'extensions' / 'skins'
| style="transform:rotate(-90deg) translate(-1.5em); max-width:2.4em; width:2.4em;" | 'execFiles'
|-
| rowspan="11" style="transform:rotate(-90deg) translate(-1.4em); max-width:1.5em;" | Existence
| <code>load</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;">↳</span> <code>__construct</code>
| style="text-align:center;" | {{set}}
| style="text-align:center;" | {{set}}
| style="text-align:center;" | {{set}}
| style="text-align:center;" | {{set}}
| style="text-align:center;" | {{set}}
| style="text-align:center;" | {{set}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | {{set}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | {{set}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{read}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;">| ↳</span> <code>selectFarm</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;">↳</span> <code>checkExistence</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{read}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;">| ↳</span> <code>checkHostVariables</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;">| ↳</span> <code>setVersion</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="hide-when-cache-loaded">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | <span class="hide-when-cache-loaded">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="hide-when-cache-loaded">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="hide-when-cache-loaded hide-when-mode-monoversion">{{set}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span><span class="hide-when-cache-loaded hide-when-mode-multiversion">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="hide-when-cache-loaded">{{set}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | <span class="hide-when-cache-loaded">{{set}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | <span class="hide-when-cache-loaded">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="hide-when-cache-loaded hide-when-mode-monoversion">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span><span class="hide-when-cache-loaded hide-when-mode-multiversion">{{-}}</span>
| style="text-align:center;" | <span class="hide-when-cache-loaded hide-when-mode-monoversion">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span><span class="hide-when-cache-loaded hide-when-mode-multiversion">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;">| ↳</span> <code>setOtherVariables</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;">↳</span> <code>getConfigFile</code>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <code>setVariable</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <code>updateVersionAfterMaintenance</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{read}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <code>updateVersion</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="hide-when-deployment-without hide-when-mode-monoversion">{{read}}</span><span class="deployment-default-hide show-when-deployment-without void">{{-}}</span><span class="hide-when-deployment-without hide-when-mode-multiversion">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="mode-default-hide show-when-mode-multiversion">{{read}}</span><span class="mode-default-show hide-when-mode-multiversion void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="hide-when-deployment-without hide-when-mode-monoversion">{{set}}</span><span class="deployment-default-hide show-when-deployment-without void">{{-}}</span><span class="hide-when-deployment-without hide-when-mode-multiversion">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| rowspan="6" style="transform:rotate(-90deg) translate(-2.5em); max-width:1.5em;" | Configuration
| <code>loadMediaWikiConfig</code>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;">↳</span> <code>getMediaWikiConfig</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;"> ↳</span> <code>populateSettings</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;"> ↳</span> <code>extractSkinsAndExtensions</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;"> | ↳</span> <code>detectLoadingMechanism</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;"> ↳</span> <code>createLocalSettings</code>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| rowspan="4" style="transform:rotate(-90deg) translate(-0.55em); max-width:1.5em;" | Utility
| <code>isLocalSettingsFresh</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{read}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-empty show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-empty hide-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <code>replaceVariable</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{read}}
| style="text-align:center;" | {{read}}
| style="text-align:center;" | {{read}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <code>readFile</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{read}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <code>cacheFile</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| colspan="2" | (MediaWiki)
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | <span class="hide-when-cache-loaded">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span>
|}
== Explanations (English) ==
This is a hand-made matrix describing what function read or modify what internal data for the software [https://phabricator.wikimedia.org/diffusion/EMWF/ MediaWikiFarm], a MediaWiki "extension" to manage MediaWiki farms of wikis.
This represents the class [https://phabricator.wikimedia.org/diffusion/EMWF/browse/master/src/MediaWikiFarm.php MediaWikiFarm], which is the main class containing almost all logic. Each row is a method (roughly sorted by chronological order in a typical run) and each column is a class property (all are protected). In each cell, there is either:
* {{read}}: the property is (only) read in the method;
* {{set}}: the property is set in the method (and possibly read);
* {{-}}: the property is neither read or set in the method.
In my previous <s>games</s> works on static analysis of this software, I created [[:mw:File:Call graph of extension MediaWikiFarm.svg|the call graph]] with an external software. But, to be more exact, this call graph is only [[:wikipedia:Call graph|an overapproximation]] since the exact (dynamic) call graph is a subset of this one: in a run, possibly some paths are not executed since it depends on the context.
Here, this is the "data graph", and there are different contexts: on the top left, you can choose the various main contexts in which the software can run. This depends mainly from the environment and the configuration, and the possibilities listed here are only the main ones.
The main result coming from this representation is: "the cache drastically reduces the processing". In fact this is not a surprise, it was designed for it, but such a sparse matrix is encouraging and help to visualise the inter-relations. When benchmarking the software, a no-cache run takes 10-15 milliseconds, and a with-cache run takes 85 microseconds (roughly 130 times less).
== Explications (français) ==
Ceci est une matrice créée à la main qui décrit quels fonctions lisent ou modifient quelles données internes pour le logiciel [https://phabricator.wikimedia.org/diffusion/EMWF/ MediaWikiFarm], une "extension" MediaWiki pour gérer des fermes de wikis.
Ceci représente la classe [https://phabricator.wikimedia.org/diffusion/EMWF/browse/master/src/MediaWikiFarm.php MediaWikiFarm] qui se trouve être la classe principale contenant presque toute la logique. Chaque ligne est une méthode (grossièrement ordonnées par ordre chronologique lors d’une exécution classique) et chaque colonne est une des propriétés de la classe (toutes sont protégées). Dans chaque cellule, il y a soit :
* {{read}} : la propriété est (seulement) lue par la méthode ;
* {{set}} : la propriété est modifiée par la méthode (et possiblement lue) ;
* {{-}} : la propriété n’est ni lue ni modifiée par la méthode.
Dans mes précédents <s>jeux</s> travaux sur l’analyse statique de ce logiciel, j’avais créé [[:mw:File:Call graph of extension MediaWikiFarm.svg|le graphe d’appels]] à l’aide d’un programme externe. Mais, pour être exact, ce graphe d’appels n’est qu’[[:wikipedia:Call graph|une sur-estimation]] puisque le graphe d’appels (dynamique) est un sous-ensemble de celui-ci : lors d’une exécution, certains chemins peuvent ne pas être exécutés en fonction du contexte.
Ici, nous avons le "graphe des données" et il y a différents contextes : en haut à gauche, vous pouvez choisir les différents contextes principaux dans lesquels le programme peut s’exécuter. Cela dépend principalement de l’environnement et de la configuration, et les possibilités listées ici ne sont que les principales.
Le principal résultat obtenu grâce à cette représentation est : « le cache diminue drastiquement le traitement ». En fait, cela n’est pas une surprise, le programme a été conçu dans ce but, mais une telle matrice creuse est encourageante et aide à visualiser les inter-relations. Lors de tests de performance, une exécution sans cache prend 10-15 millisecondes, et une exécution avec cache prend 85 microsecondes (environ 130 fois moins).
bf2aa666c53ae8b202bfd67cd91193b7ac541b5a
575
574
2016-11-21T08:39:58Z
Seb35
1
mistake in getMediaWikiConfig
wikitext
text/x-wiki
([[#Explanations (English)|explanation below]] - [[#Explications (français)|explications ci-dessous)]]
{| class="wikitable"
|-
! rowspan="3" colspan="2" | Time ↧<br /><span style="font-weight:normal;">
<span id="link-mode-monoversion">Monoversion</span> / <span id="link-mode-multiversion" class="link-selected">Multiversion</span><br />
<span id="link-cache-no">No cache</span> / <span id="link-cache-empty" class="link-selected">Empty</span> / <span id="link-cache-loaded">Loaded</span><br />
<span id="link-deployment-with" class="link-selected">With</span> / <span id="link-deployment-without">Without</span> deployment file<br />
<span id="link-env-web" class="link-selected">Web</span> / <span id="link-env-cli">CLI</span> / <span id="link-env-update">update</span><br />
<span id="link-all">(All)</span> - As of [https://phabricator.wikimedia.org/rEMWF1b151729d9eee8feae601c6b0fc20469c8b86117 1b15172]
</span>
! colspan="16" | Properties
! colspan="9" | Files
|-
| rowspan="2" style="transform:rotate(-90deg) translate(-0.9em); max-width:2.4em; width:2.4em;" | farmDir
| rowspan="2" style="transform:rotate(-90deg) translate(-1.3em); max-width:2.4em; width:2.4em;" | configDir
| rowspan="2" style="transform:rotate(-90deg) translate(-0.9em); max-width:2.4em; width:2.4em;" | codeDir
| rowspan="2" style="transform:rotate(-90deg) translate(-1.15em); max-width:2.4em; width:2.4em;" | cacheDir
| colspan="2" style="text-align:center;" | params
| colspan="4" style="text-align:center;" | farmConfig
| colspan="3" style="text-align:center;" | variables
| colspan="3" style="text-align:center;" | configuration
| rowspan="2" style="transform:rotate(-90deg) translate(-1.5em); max-width:2.4em; width:2.4em;" | farms.yml
| rowspan="2" style="transform:rotate(-90deg) translate(-2.2em); max-width:2.4em; width:2.4em;" | variable.yml
| rowspan="2" style="transform:rotate(-90deg) translate(-1.5em); max-width:2.4em; width:2.4em;" | config.yml
| rowspan="2" style="transform:rotate(-90deg) translate(-2.1em); max-width:2.4em; width:2.4em;" | versions.yml
| rowspan="2" style="transform:rotate(-90deg) translate(-3.3em); max-width:2.4em; width:2.4em;" | deployments.php
| rowspan="2" style="transform:rotate(-90deg) translate(-4.0em); max-width:2.4em; width:2.4em;" | (cache) versions.php
| rowspan="2" style="transform:rotate(-90deg) translate(-3.5em); max-width:2.4em; width:2.4em;" | (cache) config.php
| rowspan="2" style="transform:rotate(-90deg) translate(-5.4em); max-width:2.4em; width:2.4em; height:13.5em;" | (cache) LocalSettings.php
| rowspan="2" style="transform:rotate(-90deg) translate(-1.4em); max-width:2.4em; width:2.4em; height:13.5em;" | main.php
|-
| style="transform:rotate(-90deg) translate(-1.4em); max-width:2.4em; width:2.4em;" | 'EntryPoint'
| style="transform:rotate(-90deg) translate(-3.5em); max-width:2.4em; width:2.4em; height:10em;" | 'ExtensionRegistry'
| style="transform:rotate(-90deg) translate(-1.0em); max-width:2.4em; width:2.4em;" | 'variables'
| style="transform:rotate(-90deg) translate(-2.0em); max-width:2.4em; width:2.4em;" | 'coreconfig'
| style="transform:rotate(-90deg) translate(-0.1em); max-width:2.4em; width:2.4em;" | 'config'
| style="transform:rotate(-90deg) translate( 0.3em); max-width:2.4em; width:2.4em;" | Other
| style="transform:rotate(-90deg) translate(-1.2em); max-width:2.4em; width:2.4em;" | '$CODE'
| style="transform:rotate(-90deg) translate(-2.1em); max-width:2.4em; width:2.4em;" | '$VERSION'
| style="transform:rotate(-90deg) translate(-0.5em); max-width:2.4em; width:2.4em;" | Other
| style="transform:rotate(-90deg) translate(-3.5em); max-width:2.4em; width:2.4em;" | 'settings' / 'arrays'
| style="transform:rotate(-90deg) translate(-3.8em); max-width:2.4em; width:2.4em;" | 'extensions' / 'skins'
| style="transform:rotate(-90deg) translate(-1.5em); max-width:2.4em; width:2.4em;" | 'execFiles'
|-
| rowspan="11" style="transform:rotate(-90deg) translate(-1.4em); max-width:1.5em;" | Existence
| <code>load</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;">↳</span> <code>__construct</code>
| style="text-align:center;" | {{set}}
| style="text-align:center;" | {{set}}
| style="text-align:center;" | {{set}}
| style="text-align:center;" | {{set}}
| style="text-align:center;" | {{set}}
| style="text-align:center;" | {{set}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | {{set}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | {{set}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{read}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;">| ↳</span> <code>selectFarm</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;">↳</span> <code>checkExistence</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{read}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;">| ↳</span> <code>checkHostVariables</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;">| ↳</span> <code>setVersion</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="hide-when-cache-loaded">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | <span class="hide-when-cache-loaded">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="hide-when-cache-loaded">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="hide-when-cache-loaded hide-when-mode-monoversion">{{set}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span><span class="hide-when-cache-loaded hide-when-mode-multiversion">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="hide-when-cache-loaded">{{set}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | <span class="hide-when-cache-loaded">{{set}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | <span class="hide-when-cache-loaded">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="hide-when-cache-loaded hide-when-mode-monoversion">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span><span class="hide-when-cache-loaded hide-when-mode-multiversion">{{-}}</span>
| style="text-align:center;" | <span class="hide-when-cache-loaded hide-when-mode-monoversion">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span><span class="hide-when-cache-loaded hide-when-mode-multiversion">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;">| ↳</span> <code>setOtherVariables</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;">↳</span> <code>getConfigFile</code>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <code>setVariable</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <code>updateVersionAfterMaintenance</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{read}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <code>updateVersion</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="hide-when-deployment-without hide-when-mode-monoversion">{{read}}</span><span class="deployment-default-hide show-when-deployment-without void">{{-}}</span><span class="hide-when-deployment-without hide-when-mode-multiversion">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="mode-default-hide show-when-mode-multiversion">{{read}}</span><span class="mode-default-show hide-when-mode-multiversion void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="hide-when-deployment-without hide-when-mode-monoversion">{{set}}</span><span class="deployment-default-hide show-when-deployment-without void">{{-}}</span><span class="hide-when-deployment-without hide-when-mode-multiversion">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| rowspan="6" style="transform:rotate(-90deg) translate(-2.5em); max-width:1.5em;" | Configuration
| <code>loadMediaWikiConfig</code>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;">↳</span> <code>getMediaWikiConfig</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;"> ↳</span> <code>populateSettings</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;"> ↳</span> <code>extractSkinsAndExtensions</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{set}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;"> | ↳</span> <code>detectLoadingMechanism</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <span style="font-family:monospace;"> ↳</span> <code>createLocalSettings</code>
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| rowspan="4" style="transform:rotate(-90deg) translate(-0.55em); max-width:1.5em;" | Utility
| <code>isLocalSettingsFresh</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{read}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-empty show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-empty hide-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <code>replaceVariable</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{read}}
| style="text-align:center;" | {{read}}
| style="text-align:center;" | {{read}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <code>readFile</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{read}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| <code>cacheFile</code>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-no show-when-cache-empty">{{read}}</span><span class="cache-default-show hide-when-cache-no hide-when-cache-empty void">{{-}}</span>
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
|-
| colspan="2" | (MediaWiki)
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | {{-}}
| style="text-align:center;" | <span class="cache-default-hide show-when-cache-loaded">{{read}}</span><span class="cache-default-show hide-when-cache-loaded void">{{-}}</span>
| style="text-align:center;" | <span class="hide-when-cache-loaded">{{read}}</span><span class="cache-default-hide show-when-cache-loaded void">{{-}}</span>
|}
== Explanations (English) ==
This is a hand-made matrix describing what function read or modify what internal data for the software [https://phabricator.wikimedia.org/diffusion/EMWF/ MediaWikiFarm], a MediaWiki "extension" to manage MediaWiki farms of wikis.
This represents the class [https://phabricator.wikimedia.org/diffusion/EMWF/browse/master/src/MediaWikiFarm.php MediaWikiFarm], which is the main class containing almost all logic. Each row is a method (roughly sorted by chronological order in a typical run) and each column is a class property (all are protected). In each cell, there is either:
* {{read}}: the property is (only) read in the method;
* {{set}}: the property is set in the method (and possibly read);
* {{-}}: the property is neither read or set in the method.
In my previous <s>games</s> works on static analysis of this software, I created [[:mw:File:Call graph of extension MediaWikiFarm.svg|the call graph]] with an external software. But, to be more exact, this call graph is only [[:wikipedia:Call graph|an overapproximation]] since the exact (dynamic) call graph is a subset of this one: in a run, possibly some paths are not executed since it depends on the context.
Here, this is the "data graph", and there are different contexts: on the top left, you can choose the various main contexts in which the software can run. This depends mainly from the environment and the configuration, and the possibilities listed here are only the main ones.
The main result coming from this representation is: "the cache drastically reduces the processing". In fact this is not a surprise, it was designed for it, but such a sparse matrix is encouraging and help to visualise the inter-relations. When benchmarking the software, a no-cache run takes 10-15 milliseconds, and a with-cache run takes 85 microseconds (roughly 130 times less).
== Explications (français) ==
Ceci est une matrice créée à la main qui décrit quels fonctions lisent ou modifient quelles données internes pour le logiciel [https://phabricator.wikimedia.org/diffusion/EMWF/ MediaWikiFarm], une "extension" MediaWiki pour gérer des fermes de wikis.
Ceci représente la classe [https://phabricator.wikimedia.org/diffusion/EMWF/browse/master/src/MediaWikiFarm.php MediaWikiFarm] qui se trouve être la classe principale contenant presque toute la logique. Chaque ligne est une méthode (grossièrement ordonnées par ordre chronologique lors d’une exécution classique) et chaque colonne est une des propriétés de la classe (toutes sont protégées). Dans chaque cellule, il y a soit :
* {{read}} : la propriété est (seulement) lue par la méthode ;
* {{set}} : la propriété est modifiée par la méthode (et possiblement lue) ;
* {{-}} : la propriété n’est ni lue ni modifiée par la méthode.
Dans mes précédents <s>jeux</s> travaux sur l’analyse statique de ce logiciel, j’avais créé [[:mw:File:Call graph of extension MediaWikiFarm.svg|le graphe d’appels]] à l’aide d’un programme externe. Mais, pour être exact, ce graphe d’appels n’est qu’[[:wikipedia:Call graph|une sur-estimation]] puisque le graphe d’appels (dynamique) est un sous-ensemble de celui-ci : lors d’une exécution, certains chemins peuvent ne pas être exécutés en fonction du contexte.
Ici, nous avons le "graphe des données" et il y a différents contextes : en haut à gauche, vous pouvez choisir les différents contextes principaux dans lesquels le programme peut s’exécuter. Cela dépend principalement de l’environnement et de la configuration, et les possibilités listées ici ne sont que les principales.
Le principal résultat obtenu grâce à cette représentation est : « le cache diminue drastiquement le traitement ». En fait, cela n’est pas une surprise, le programme a été conçu dans ce but, mais une telle matrice creuse est encourageante et aide à visualiser les inter-relations. Lors de tests de performance, une exécution sans cache prend 10-15 millisecondes, et une exécution avec cache prend 85 microsecondes (environ 130 fois moins).
0252258c7ab510380860f6719633a62ad98c082e
MediaWiki:Common.js
8
163
567
2016-11-20T21:03:36Z
Seb35
1
+js spécifique à [[MediaWikiFarm static analysis]]
javascript
text/javascript
/* Tout JavaScript ici sera chargé avec chaque page accédée par n’importe quel utilisateur. */
$( function() {
if( $( '.page-MediaWikiFarm_static_analysis' ).length == 0 ) return;
var families = {},
listfamilies = [],
all = false,
changeLink = function(family, value) {
if( all ) return;
var result = '';
families[family].forEach( function(v) {
if( v != value ) {
$('#link-' + family + '-' + v).removeClass('link-selected').css('font-weight', 'normal');
} else {
$('#link-' + family + '-' + value).addClass('link-selected').css('font-weight', 'bold');
}
} );
$('#css-'+family).text(
'.' + family + '-default-hide { display: none; } ' +
'.' + family + '-default-show { display: inline; } ' +
'.hide-when-' + family + '-' + value + ' { display: none; } ' +
'.show-when-' + family + '-' + value + ' { display: inline; } ' +
'.' + family + '-' + value + ' { display: inline; }'
);
};
$( '#mw-content-text table th span#link-all').wrapInner( '<a id="thelink-all"></a>' );
$( '#thelink-all').click( function() {
if( !all ) {
listfamilies.forEach( function(family) {
families[family].forEach( function(v) {
$('#link-' + family + '-' + v).css('font-weight', 'bold');
$('#css-'+family).text(
'.' + family + '-default-hide, ' +
'.' + family + '-default-show, ' +
'.hide-when-' + family + '-' + v + ', ' +
'.show-when-' + family + '-' + v + ', ' +
'.' + family + '-' + v + ' { display: inline; }' +
'.void { display: none; }'
);
} );
} );
$(this).text('(Reset)');
all = true;
} else {
window.location.reload();
all = false;
}
} );
$( '#mw-content-text table th span' ).each( function() {
if( $(this).attr('id') && $(this).attr('id').match( /^link-/ ) ) {
var result = $(this).attr('id').match( /^link-([a-z]+)-([a-z]+)$/ );
if( !families[result[1]] ) families[result[1]] = [];
listfamilies.push( result[1] );
families[result[1]].push( result[2] );
if( $('#css-' + result[1]).length == 0 ) {
$('head').append( '<style id="css-' + result[1] + '" type="text/css"></style>' );
}
$(this).wrapInner( '<a id="thelink-' + result[1] + '-' + result[2] + '"></a>' );
$('#thelink-' + result[1] + '-' + result[2]).click( function() {
changeLink( result[1], result[2] );
return false;
} );
if( $(this).hasClass('link-selected') ) {
changeLink( result[1], result[2] );
}
}
} );
} );
da823b715d0c308ce9fcf6c19a46da2375b0eaa2
Modèle:Read
10
164
568
2016-11-20T21:04:11Z
Seb35
1
Page créée avec « <span style="color:green;">read</span> »
wikitext
text/x-wiki
<span style="color:green;">read</span>
61fea418d6bd9eb850f4b6ef347e1e0dcae66544
Modèle:Set
10
165
569
2016-11-20T21:04:46Z
Seb35
1
Page créée avec « <span style="color:green;">read</span> »
wikitext
text/x-wiki
<span style="color:green;">read</span>
61fea418d6bd9eb850f4b6ef347e1e0dcae66544
571
569
2016-11-20T21:06:17Z
Seb35
1
wikitext
text/x-wiki
<span style="color:red;">set</span>
d93f10383be06df62e1ca2d08f1ae4df0517b7db
Modèle:-
10
166
570
2016-11-20T21:04:49Z
Seb35
1
Page créée avec « <span style="color:#aaa;">-</span> »
wikitext
text/x-wiki
<span style="color:#aaa;">-</span>
e2060131ebe803e73ac519016d7e64689b073176
MediaWiki:Common.css
8
4
572
451
2016-11-20T21:08:23Z
Seb35
1
css
text/css
/* Contenu en couleur noire et non grise */
div#content {
color: black;
}
a:not([href]) {
cursor: pointer;
}
/* Code en couleur grise */
pre, code, tt, kbd, samp, .mw-code {
color: #252525;
}
/* Espace de noms Présentation avec un style « diapositives » */
.ns-104.action-view {
background: white;
height: 95%;
}
.ns-104.action-view #mw-page-base, .ns-104.action-view #mw-head-base, .ns-104.action-view #mw-navigation, .ns-104.action-view #footer, .ns-104 #contentSub {
display: none;
}
.ns-104.action-view #content {
width: 90%;
height: 95%;
margin: 1% auto;
padding: 1em;
border: 1px solid #A7D7F9;
}
.ns-104.action-view #bodyContent {
height: 95%;
}
.ns-104.action-view #mw-content-text {
height: 95%;
}
.ns-104 .mw-body-content {
font-size: 0.975em;
}
.ns-104 h1, .ns-104 h2, .ns-104 h3, .ns-104 h4, .ns-104 h5, .ns-104 h6 {
border-bottom: 0px;
}
.ns-104 .presentation-bar {
font-size: 80%;
}
.ns-104 #presentation-bar-left, .ns-104 #presentation-bar-right {
position: fixed;
bottom: 3%;
}
.ns-104 #presentation-bar-left {
left: 5%
}
.ns-104 #presentation-bar-right {
right: 5%;
}
.ns-104 .presentation-purge, .ns-104 .presentation-move {
display: none;
}
/* Spécifique à la présentation sur les wikis */
.ns-104 .mw-body .external {
background: none;
padding-right: 0px;
}
.ns-104 .mw-body a, .ns-104 .mw-body a:active,
.ns-104 .mw-body a.extiw, .ns-104 .mw-body a.extiw:active,
.ns-104 .mw-body .external, .ns-104 .mw-body .external:active {
color: black;
border-bottom: 1px dotted black;
}
.ns-104 .mw-body a:hover,
.ns-104 .mw-body a.extiw:hover,
.ns-104 .mw-body .external:hover {
border-bottom: 1px dotted black;
}
.ns-104 ul, .ns-104 ol {
line-height: 2em;
}
d31683dcac39f0f883b3c32832043949251ce5fc
Utilisateur:Seb35
2
167
576
2016-12-03T11:53:32Z
Seb35
1
présentation
wikitext
text/x-wiki
Ce wiki me sert de petite base de connaissances, aussi je suis le principal contributeur, mais il est ouvert à l’édition pour qui veut.
J’y met des travaux en cours, des brouillons, etc.
[[Utilisateur:Seb35|Seb35]] ([[Discussion utilisateur:Seb35|discussion]]) 3 décembre 2016 à 12:53 (CET)
3e3fe01cbf05b4aa8cf22715367236f1882c5e1b
Kubernetes
0
174
586
2017-01-22T09:05:37Z
Seb35
1
Page créée avec « Quelques notes pour tester Kubernetes == Liens == * [https://kubernetes.io Site principal + documentation] * [https://github.com/kubernetes/kubernetes GitHub Kubernetes]... »
wikitext
text/x-wiki
Quelques notes pour tester Kubernetes
== Liens ==
* [https://kubernetes.io Site principal + documentation]
* [https://github.com/kubernetes/kubernetes GitHub Kubernetes]
* [https://www.docker.com/products/docker-engine Docker] (container engine)
* [https://github.com/coreos/rkt GitHub rkt] (container engine)
* [https://coreos.com/blog/rkt-and-kubernetes.html Blog post about rkt] (déc. 2016)
== Installation sur Debian Jessie ==
# Installer Docker [https://docs.docker.com/engine/installation/linux/debian/]
#: <code>apt-get install curl apt-transport-https</code>
#: <code>curl -fsSL https://yum.dockerproject.org/gpg | apt-key add -</code>
#: <code>echo 'deb https://apt.dockerproject.org/repo/ debian-jessie main' > /etc/apt/sources.list.d/docker.list</code>
#: <code>apt-get update</code>
#: <code>apt-get install docker-engine</code>
# Installer Kubernetes [https://kubernetes.io/docs/getting-started-guides/kubeadm/]
#: <code>curl -fsSL https://apt.kubernetes.io/doc/apt-key.gpg | apt-key add -</code>
#: <code>deb http://apt.kubernetes.io/ kubernetes-xenial main' > /etc/apt/sources.list.d/kubernetes.list</code>
#: <code>apt-get update</code>
#: <code>apt-get install kubelet kubectl kubernetes-cni</code>
15e4b9a6b25373f4575050c81ba70c291fc5f4de
587
586
2017-01-22T14:08:52Z
Seb35
1
+expérience d’un test sur un cluster CentOS sur Gandi
wikitext
text/x-wiki
Quelques notes pour tester Kubernetes
== Liens ==
* [https://kubernetes.io Site principal + documentation]
* [https://github.com/kubernetes/kubernetes GitHub Kubernetes]
* [https://www.docker.com/products/docker-engine Docker] (container engine)
* [https://github.com/coreos/rkt GitHub rkt] (container engine)
* [https://coreos.com/blog/rkt-and-kubernetes.html Blog post about rkt] (déc. 2016)
== Installation sur Debian Jessie ==
# Installer Docker [https://docs.docker.com/engine/installation/linux/debian/]
#: <code>apt-get install curl apt-transport-https</code>
#: <code>curl -fsSL https://yum.dockerproject.org/gpg | apt-key add -</code>
#: <code>echo 'deb https://apt.dockerproject.org/repo/ debian-jessie main' > /etc/apt/sources.list.d/docker.list</code>
#: <code>apt-get update</code>
#: <code>apt-get install docker-engine</code>
# Installer Kubernetes [https://kubernetes.io/docs/getting-started-guides/kubeadm/]
#: <code>curl -fsSL https://apt.kubernetes.io/doc/apt-key.gpg | apt-key add -</code>
#: <code>deb http://apt.kubernetes.io/ kubernetes-xenial main' > /etc/apt/sources.list.d/kubernetes.list</code>
#: <code>apt-get update</code>
#: <code>apt-get install kubelet kubectl kubernetes-cni</code>
== Installation d’un cluster de test CentOS sur Gandi ==
https://kubernetes.io/docs/getting-started-guides/fedora/fedora_ansible_config/
* Créé 3 VM sous CentOS 7 authentifiés par clé SSH avec une IPv4
* Sur chacune des VM :
** <code>yum update</code>
** <code>yum install net-tools/code> (pour ifconfig)
* Sur le master :
** <code>yum install epel-release</code> (pour installer ansible)
** <code>yum update</code>
** <code>yum install ansible git python-netaddr</code>
** <code>git clone https://github.com/kubernetes/contrib.git</code>
** <code>cd contrib/ansible</code>
** <code>cp inventory/localhost.ini inventory/inventory</code>
** <code>vi inventory/inventory</code> : remplacer tous les "localhost" par les noms des machines (leur reverse DNS peut être trouvé sur l’interface de Gandi en cliquant sur le détail des interfaces publiques) – ne pas laisser "localhost" dans la section "etcd" sinon les nodes se réferreront à localhost pour récupérer leur conf etc (qui bien sûr n’existe pas sur localhost)
** <code>cd scripts</code>
** <code>./deploy-cluster.sh</code>
2c5178a2de316c3c0bcf7bbb6a02c0134e8a541d
588
587
2017-01-22T15:55:37Z
Seb35
1
wikitext
text/x-wiki
Quelques notes pour tester Kubernetes
== Liens ==
* [https://kubernetes.io Site principal + documentation]
* [https://github.com/kubernetes/kubernetes GitHub Kubernetes]
* [https://www.docker.com/products/docker-engine Docker] (container engine)
* [https://github.com/coreos/rkt GitHub rkt] (container engine)
* [https://coreos.com/blog/rkt-and-kubernetes.html Blog post about rkt] (déc. 2016)
== Installation sur Debian Jessie ==
# Installer Docker [https://docs.docker.com/engine/installation/linux/debian/]
#: <code>apt-get install curl apt-transport-https</code>
#: <code>curl -fsSL https://yum.dockerproject.org/gpg | apt-key add -</code>
#: <code>echo 'deb https://apt.dockerproject.org/repo/ debian-jessie main' > /etc/apt/sources.list.d/docker.list</code>
#: <code>apt-get update</code>
#: <code>apt-get install docker-engine</code>
# Installer Kubernetes [https://kubernetes.io/docs/getting-started-guides/kubeadm/]
#: <code>curl -fsSL https://apt.kubernetes.io/doc/apt-key.gpg | apt-key add -</code>
#: <code>deb http://apt.kubernetes.io/ kubernetes-xenial main' > /etc/apt/sources.list.d/kubernetes.list</code>
#: <code>apt-get update</code>
#: <code>apt-get install kubelet kubectl kubernetes-cni</code>
== Installation d’un cluster de test CentOS sur Gandi ==
https://kubernetes.io/docs/getting-started-guides/fedora/fedora_ansible_config/
* Créé 3 VM sous CentOS 7 authentifiés par clé SSH avec une IPv4
* Sur chacune des VM :
** <code>yum update</code>
** <code>yum install net-tools</code> (pour ifconfig)
* Sur le master :
** <code>yum install epel-release</code> (pour installer ansible)
** <code>yum update</code>
** <code>yum install ansible git python-netaddr</code>
** <code>git clone https://github.com/kubernetes/contrib.git</code>
** <code>cd contrib/ansible</code>
** <code>cp inventory/localhost.ini inventory/inventory</code>
** <code>vi inventory/inventory</code> : remplacer tous les "localhost" par les noms des machines (leur reverse DNS peut être trouvé sur l’interface de Gandi en cliquant sur le détail des interfaces publiques) – ne pas laisser "localhost" dans la section "etcd" sinon les nodes se réferreront à localhost pour récupérer leur conf etc (qui bien sûr n’existe pas sur localhost)
** <code>cd scripts</code>
** <code>./deploy-cluster.sh</code>
24dad333ed307a08f98f9f572b1a7b9fab3a176c
589
588
2017-01-22T16:02:26Z
Seb35
1
/* Installation d’un cluster de test CentOS sur Gandi */
wikitext
text/x-wiki
Quelques notes pour tester Kubernetes
== Liens ==
* [https://kubernetes.io Site principal + documentation]
* [https://github.com/kubernetes/kubernetes GitHub Kubernetes]
* [https://www.docker.com/products/docker-engine Docker] (container engine)
* [https://github.com/coreos/rkt GitHub rkt] (container engine)
* [https://coreos.com/blog/rkt-and-kubernetes.html Blog post about rkt] (déc. 2016)
== Installation sur Debian Jessie ==
# Installer Docker [https://docs.docker.com/engine/installation/linux/debian/]
#: <code>apt-get install curl apt-transport-https</code>
#: <code>curl -fsSL https://yum.dockerproject.org/gpg | apt-key add -</code>
#: <code>echo 'deb https://apt.dockerproject.org/repo/ debian-jessie main' > /etc/apt/sources.list.d/docker.list</code>
#: <code>apt-get update</code>
#: <code>apt-get install docker-engine</code>
# Installer Kubernetes [https://kubernetes.io/docs/getting-started-guides/kubeadm/]
#: <code>curl -fsSL https://apt.kubernetes.io/doc/apt-key.gpg | apt-key add -</code>
#: <code>deb http://apt.kubernetes.io/ kubernetes-xenial main' > /etc/apt/sources.list.d/kubernetes.list</code>
#: <code>apt-get update</code>
#: <code>apt-get install kubelet kubectl kubernetes-cni</code>
== Installation d’un cluster de test CentOS sur Gandi ==
https://kubernetes.io/docs/getting-started-guides/fedora/fedora_ansible_config/
* Créé 3 VM sous CentOS 7 authentifiés par clé SSH avec une IPv4
* Sur chacune des VM :
** <code>yum update</code>
** <code>yum install net-tools</code> (pour ifconfig)
* Sur le master :
** <code>yum install epel-release</code> (pour installer ansible)
** <code>yum update</code>
** <code>yum install ansible git python-netaddr</code>
** <code>git clone https://github.com/kubernetes/contrib.git</code>
** <code>cd contrib/ansible</code>
** <code>cp inventory/localhost.ini inventory/inventory</code>
** <code>vi inventory/inventory</code> : remplacer tous les "localhost" par les noms des machines (leur reverse DNS peut être trouvé sur l’interface de Gandi en cliquant sur le détail des interfaces publiques) – ne pas laisser "localhost" dans la section "etcd" sinon les nodes se réferreront à localhost pour récupérer leur conf etc (qui bien sûr n’existe pas sur localhost)
** <code>cd scripts</code>
** <code>./deploy-cluster.sh</code>
Finalement, la commande <code>kubectl get nodes</code> sur le master est censée donner les deux nœuds, mais me répond avec succès (exit code 0) une liste vide. En revanche <code>systemctl | grep -i kube</code> et <code>iptables -nvL</code> me donnent des résultats censés. En fait, je n’ai pas fait la procédure décrite ci-dessus en une seule fois, aussi il est possible que le problème vienne de là, à réessayer proprement donc.
04b29036fc50c21baa6da04026d71cb5ad2863c8
Tutorial:Beautiful MediaWiki URLs
102
178
4235
3416
2017-08-10T15:57:46Z
Seb35
1
revert spam
wikitext
text/x-wiki
{{Tutorial|lang=en|status=stable}}
This page is about configurating beautiful and pure URLs for MediaWiki, basically without any visible "index.php". For example:
<div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;">
:[{{SERVER}}/{{FULLPAGENAMEE}}?action=edit http://{{SERVERNAME}}/{{FULLPAGENAMEE}}?action=edit]
''instead of''
:[{{SERVER}}/index.php?title={{FULLPAGENAMEE}}&action=edit http://{{SERVERNAME}}/index.php?title={{FULLPAGENAMEE}}&action=edit]
</div>
and it is even better in languages with non-latin alphabets:
<div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;">
:[{{SERVER}}/维基百科?action=history http://{{SERVERNAME}}/维基百科?action=history]
''instead of''
:[{{SERVER}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history http://{{SERVERNAME}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history]
</div>
== Rationale and introduction ==
The reasoning behind this is: The syntax "index.php" is not interesting from the user’s point of view so it shouldn’t be there; additionally the user should (want) to see understandable page names instead of %-encoded nonsense.
You can see on this wiki these rules in action. Technically, these ugly URLs come from good’ ol’ time’ of [[:enwikipedia:Common Gateway Interface|CGI scripts]] (ten years ago), but now —and since some time— it is possible to rewrite URLs on the server, added to the fact that all recent browsers display URLs with characters instead of %-encoded URLs, but still not in the parameters of the URL after the "?". So it’s time to remove this "index.php".
To reconciliate MediaWiki URLs with recent browsers, we take advantage of the "path info" capability offered by servers (here nginx) and we configure MediaWiki such that it vastly limit the rendering of ugly URLs.
== Prerequisites ==
* [https://www.mediawiki.org MediaWiki], installed in the directory, say, '/var/www/mediawiki'
* [http://nginx.com nginx], preferably with the module Lua (package nginx-extras in Debian/Ubuntu)
* The wiki is assumed to be installed on "<nowiki>http://wiki.example.org/</nowiki>"
* The server must support the PATH_INFO directive; it is the case for most "nginx + PHP gateway" but you should really check it works before continuing, see [https://www.mediawiki.org/Special:MyLanguage/Manual:$wgUsePathInfo Manual:$wgUsePathInfo] on MediaWiki.org.
== MediaWiki configuration ==
It is assumed the wiki is directly served from the server root location instead of a subdirectory (e.g. <nowiki>"https://example.org/" instead of "https://example.org/tools/mywiki/"</nowiki>). In other words, the "root" directive in the nginx server is the directory itself where is installed MediaWiki (where index.php is).
The following configuration variables must be added at the end of the file LocalSettings.php, in MediaWiki directory.
1. Remove the "script path" to remove all web-visible subdirectories. This should be done accordingly with nginx configuration, or it could break the installed website.
$wgScriptPath = <nowiki>''</nowiki>;
2. Set the article path to its simplest form. With this, links leading to the 'view' action of the pages will be beautiful, instead of using "index.php". The server should support the "path info" capability —it’s the case of nginx.
$wgArticlePath = '/$1';
3. Now, true improvements begin. When you view an article, the URL is beautiful, but it becomes again ugly when you edit an article or ask its printable form. So let’s remove the "index.php".
$wgScript = <nowiki>''</nowiki>;
4. The links for the actions now have the form "/Main_Page?title=Main_Page&action=edit" for the edit action. There is still the "title=" parameter which should be removed since it is already displayed in the main part of the URL. To achieve that, we have to add a small hook in LocalSettings.php to remove the "title=" parameter.
$wgHooks['GetLocalURL::Internal'][] = 'phpAgnosticURL';
function phpAgnosticURL( $title, &$url, $query ) {
global $wgArticlePath;
$url = str_replace( '$1', wfUrlencode( $title->getPrefixedDBkey() ), $wgArticlePath );
while ( preg_match( '/^(.*&|)title=([^&]*)(&.*|)$/', $query, $matches ) ) {
$query = $matches[1] . $matches[3];
}
if ( $query != <nowiki>''</nowiki> ) {
$url = wfAppendQuery( $url, $query );
}
}
Basically, MediaWiki now generates beautiful URLs but nginx no more understand the URLs where there is no "title=" parameter. In the next part, we will retablish the functioning, we will completely hide the PHP system files (this improves security), and by the way permit the creation of page with almost all possible titles (e.g. you will be able to create the page "Index.php" on the wiki; it is probably useless^^, but perhaps you can be interested by titles "Skins/…").
== Nginx configuration ==
5. The basic skeleton is just below. 'location' directives will be added in the following.
server {
listen 80;
listen 443 ssl;
server_name wiki.example.org;
root /var/www/mediawiki;
# 'location' directives to be added thereafter
}
6. First, let’s add simple things: backend PHP scripts. We don’t search to hide them, they are backend so not viewed by human users, but machines must have access to these scripts.
location ~ ^/(api|load|opensearch_desc)\.php$ {
include php5-fpm.conf;
}
7. Next, the more important thing: the call to the hidden "index.php" to catch all actions and transmit them to MediaWiki. This use the PATH_INFO parameter of CGI scripts. Additionally, we add an exception for the situation where there is still a parameter "title="; it’s the case in MediaWiki forms (Special:Recentchanges, Special:Log, etc.) and it will make the whole system both backward-compatible and with beautiful URLs (a permanent redirect from the old URLs to the new URLs). The Lua rewriting part was done thanks to an [http://forum.nginx.org/read.php?2,243462,243464 agentzh’s message] (thanks!).
location / {
if ($arg_title != <nowiki>''</nowiki>) {
set_by_lua $mwredirect '
local args = ngx.var.args
local arg_title = ngx.var.arg_title
arg_title = ngx.re.gsub(arg_title, "%3A", ":")
arg_title = ngx.re.gsub(arg_title, "%20", "_")
arg_title = ngx.re.gsub(arg_title, "[+]", "_")
local url = "/" .. arg_title
newargs, n, err = ngx.re.gsub(args, [[\btitle=[^&]*&?]], "", "jo")
if string.len(newargs) > 0 then
url = url .. "?" ..newargs
end
if string.sub(url, -1) == "&" then
url = string.sub(url, 1, -2)
end
return url
';
return 301 $mwredirect;
}
include php5-fpm.conf;
fastcgi_split_path_info ^(/)(.*)$;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
8. Now, you should have a quite functional wiki, apart some missing images. Let’s add the UI images from the /skins subdirectory and the /extensions subdirectory at the same time (some extensions have JavaScript files or image files in their directories). Here are only allowed: the images, the JS files, the CSS and LESS files, and the .htc files (used by IE).
location ~ ^/(extensions|skins)/ {
location ~ \.(js|css|htc|less|png|svg|gif|jpg|xcf)$ {
allow all;
try_files $uri =403;
}
deny all;
}
9. Now we can allow integrated files of the /images subdirectory. Below are two variants depending if your wiki is public or private.
location ~ ^/images/ {
# Publicly accessible files
location ~ ^/images/(\.htaccess|README|lockdir.*)$ {
return 404;
}
location ~ /$ {
deny all;
}
try_files $uri =404;
# Private files for a private wiki
#include php5-fpm.conf;
#fastcgi_split_path_info ^(/images/)(.*)$;
#fastcgi_param SCRIPT_FILENAME $document_root/img_auth.php;
#fastcgi_param PATH_INFO $fastcgi_path_info;
}
10. To finish, we can add /robots.txt and /favicon.ico.
location ~ ^/(robots.txt|favicon.ico)$ {
try_files $uri =404;
}
== Complements ==
a. If you cannot install the Lua module in nginx, directly-entered old URLs (coming from external places like emails, other websites, user bookmarks, etc.) will work but will be displayed as old URLs ("/index.php?title=Main_Page&action=edit"). Once the user click on some link on the wiki, s/he will see new URLs.
b. To avoid MediaWiki to create URLs with remaining "title=" parameters, MediaWiki core should be patched in many places: in all forms where there is a <nowiki><input type="hidden" name="title" … /></nowiki> HTML tag and possibly in other places. Possibly some bug should be created, at least to give an option to natively create beautiful URLs.
c. MediaWiki update maintenance: nothing from the MediaWiki configuration side, apart if you modify MediaWiki core (it is not recommanded to facilitate updates). Probably the changed configuration parameters will stay backward-compatible for some long time since most were introduced in pre 1.1.0 MediaWiki versions. Possibly some PHP scripts must be added in the point 6 in future MediaWiki releases, see the entry points in your Special:Version page or on [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org. Possibly you can want to change the files enumerated in point 9 (this list is better from a security point of view, but this requires maintenance over time).
d. The nginx configuration above was done with strict security considerations in order to remove all entry points to system files, but this requires maintenance over time. You can want to soften these security checks:
# add more PHP scripts in point 6, see [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org
# add more media files extensions in point 8, or even acess all files in the "extensions" and "skins" subdirectories, or at the contrary blacklist some file extensions (e.g. mainly .php files)
# remove the list of files in point 9, this is probably harmless from a security point of view
e. The list in point 10 could be changed depending of specific needs. For example, you could change the location of the favicon (see [https://www.mediawiki.org/wiki/Manual:$wgFavicon $wgFavicon]), or you can add a file /sitemap.xml, etc. Additionally some MediaWiki extensions or core features propose to manage some "metadata system files" like /robots.txt or /sitemap.xml; if you want to use these features, you could have to create other "location" in nginx configuration with some wrapper to PHP file, similarly to the wrapper for "/images/" in the case of a private wiki.
f. As of MediaWiki 1.23, the entry points on the page Special:Version will show "[ ]" for "index.php", this can be considered a ''bug'': the case where "index.php" is completely removed is not expected :)
g. An easier way to remove most of the index.php is to use [[:mw:Manual:$wgActionPaths|$wgActionPaths]]. With this configuration setting, the 'edit' action on this page would be <tt>[{{SERVER}}/edit/{{FULLPAGENAMEE}} http://{{SERVERNAME}}/edit/{{FULLPAGENAMEE}}]</tt> instead of <tt>[{{SERVER}}/{{FULLPAGENAMEE}}?action=edit http://{{SERVERNAME}}/{{FULLPAGENAMEE}}?action=edit]</tt>. I have no opinion on what is better. It can be kept in mind that some browsers might remove the address part after the "?"; in these browsers, the action would or would not be displayed. Note : how does MediaWiki react with $wgActionPaths when there are (e.g.) "action=edit" and "section=0": is it "/edit/Title?section=0" or "/index.php?title=Title&action=edit§ion=0"?
== Conclusion ==
# Now the URLs are "/Main_Page", "/Main_Page?action=history", "/Main_Page?printable=yes", etc.
# Non-latin alphabets benefit of the "real characters" rendering of the browser in the URL
# The system is backward-compatible with existing URLs, and old URLs are rewritten if you have installed the Lua part in the nginx configuration.
# Your articles can have a wide range of titles and are not limited by system files, e.g. you can write articles about "Robots.txt", "Images", "Skins", or "Index.php" (NB: the initial capital).
# Except whitelisted system files and subdirectories, nobody can access to the underlying system files: e.g. "includes/Title.php" is considered as an article, as well as "LocalSettings.php", hence an attacker does not have a direct access to the system files and s/he will have to deal with MediaWiki before attacking PHP files.
03570137c0bdf1de0f81eeba154fcb9ac854b005
4236
4235
2017-08-10T15:58:31Z
Seb35
1
A protégé « [[Tutorial:Beautiful MediaWiki URLs]] » : Pourriels ([Modifier=Autoriser uniquement les utilisateurs auto-confirmés] (infini) [Renommer=Autoriser uniquement les utilisateurs auto-confirmés] (infini))
wikitext
text/x-wiki
{{Tutorial|lang=en|status=stable}}
This page is about configurating beautiful and pure URLs for MediaWiki, basically without any visible "index.php". For example:
<div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;">
:[{{SERVER}}/{{FULLPAGENAMEE}}?action=edit http://{{SERVERNAME}}/{{FULLPAGENAMEE}}?action=edit]
''instead of''
:[{{SERVER}}/index.php?title={{FULLPAGENAMEE}}&action=edit http://{{SERVERNAME}}/index.php?title={{FULLPAGENAMEE}}&action=edit]
</div>
and it is even better in languages with non-latin alphabets:
<div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;">
:[{{SERVER}}/维基百科?action=history http://{{SERVERNAME}}/维基百科?action=history]
''instead of''
:[{{SERVER}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history http://{{SERVERNAME}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history]
</div>
== Rationale and introduction ==
The reasoning behind this is: The syntax "index.php" is not interesting from the user’s point of view so it shouldn’t be there; additionally the user should (want) to see understandable page names instead of %-encoded nonsense.
You can see on this wiki these rules in action. Technically, these ugly URLs come from good’ ol’ time’ of [[:enwikipedia:Common Gateway Interface|CGI scripts]] (ten years ago), but now —and since some time— it is possible to rewrite URLs on the server, added to the fact that all recent browsers display URLs with characters instead of %-encoded URLs, but still not in the parameters of the URL after the "?". So it’s time to remove this "index.php".
To reconciliate MediaWiki URLs with recent browsers, we take advantage of the "path info" capability offered by servers (here nginx) and we configure MediaWiki such that it vastly limit the rendering of ugly URLs.
== Prerequisites ==
* [https://www.mediawiki.org MediaWiki], installed in the directory, say, '/var/www/mediawiki'
* [http://nginx.com nginx], preferably with the module Lua (package nginx-extras in Debian/Ubuntu)
* The wiki is assumed to be installed on "<nowiki>http://wiki.example.org/</nowiki>"
* The server must support the PATH_INFO directive; it is the case for most "nginx + PHP gateway" but you should really check it works before continuing, see [https://www.mediawiki.org/Special:MyLanguage/Manual:$wgUsePathInfo Manual:$wgUsePathInfo] on MediaWiki.org.
== MediaWiki configuration ==
It is assumed the wiki is directly served from the server root location instead of a subdirectory (e.g. <nowiki>"https://example.org/" instead of "https://example.org/tools/mywiki/"</nowiki>). In other words, the "root" directive in the nginx server is the directory itself where is installed MediaWiki (where index.php is).
The following configuration variables must be added at the end of the file LocalSettings.php, in MediaWiki directory.
1. Remove the "script path" to remove all web-visible subdirectories. This should be done accordingly with nginx configuration, or it could break the installed website.
$wgScriptPath = <nowiki>''</nowiki>;
2. Set the article path to its simplest form. With this, links leading to the 'view' action of the pages will be beautiful, instead of using "index.php". The server should support the "path info" capability —it’s the case of nginx.
$wgArticlePath = '/$1';
3. Now, true improvements begin. When you view an article, the URL is beautiful, but it becomes again ugly when you edit an article or ask its printable form. So let’s remove the "index.php".
$wgScript = <nowiki>''</nowiki>;
4. The links for the actions now have the form "/Main_Page?title=Main_Page&action=edit" for the edit action. There is still the "title=" parameter which should be removed since it is already displayed in the main part of the URL. To achieve that, we have to add a small hook in LocalSettings.php to remove the "title=" parameter.
$wgHooks['GetLocalURL::Internal'][] = 'phpAgnosticURL';
function phpAgnosticURL( $title, &$url, $query ) {
global $wgArticlePath;
$url = str_replace( '$1', wfUrlencode( $title->getPrefixedDBkey() ), $wgArticlePath );
while ( preg_match( '/^(.*&|)title=([^&]*)(&.*|)$/', $query, $matches ) ) {
$query = $matches[1] . $matches[3];
}
if ( $query != <nowiki>''</nowiki> ) {
$url = wfAppendQuery( $url, $query );
}
}
Basically, MediaWiki now generates beautiful URLs but nginx no more understand the URLs where there is no "title=" parameter. In the next part, we will retablish the functioning, we will completely hide the PHP system files (this improves security), and by the way permit the creation of page with almost all possible titles (e.g. you will be able to create the page "Index.php" on the wiki; it is probably useless^^, but perhaps you can be interested by titles "Skins/…").
== Nginx configuration ==
5. The basic skeleton is just below. 'location' directives will be added in the following.
server {
listen 80;
listen 443 ssl;
server_name wiki.example.org;
root /var/www/mediawiki;
# 'location' directives to be added thereafter
}
6. First, let’s add simple things: backend PHP scripts. We don’t search to hide them, they are backend so not viewed by human users, but machines must have access to these scripts.
location ~ ^/(api|load|opensearch_desc)\.php$ {
include php5-fpm.conf;
}
7. Next, the more important thing: the call to the hidden "index.php" to catch all actions and transmit them to MediaWiki. This use the PATH_INFO parameter of CGI scripts. Additionally, we add an exception for the situation where there is still a parameter "title="; it’s the case in MediaWiki forms (Special:Recentchanges, Special:Log, etc.) and it will make the whole system both backward-compatible and with beautiful URLs (a permanent redirect from the old URLs to the new URLs). The Lua rewriting part was done thanks to an [http://forum.nginx.org/read.php?2,243462,243464 agentzh’s message] (thanks!).
location / {
if ($arg_title != <nowiki>''</nowiki>) {
set_by_lua $mwredirect '
local args = ngx.var.args
local arg_title = ngx.var.arg_title
arg_title = ngx.re.gsub(arg_title, "%3A", ":")
arg_title = ngx.re.gsub(arg_title, "%20", "_")
arg_title = ngx.re.gsub(arg_title, "[+]", "_")
local url = "/" .. arg_title
newargs, n, err = ngx.re.gsub(args, [[\btitle=[^&]*&?]], "", "jo")
if string.len(newargs) > 0 then
url = url .. "?" ..newargs
end
if string.sub(url, -1) == "&" then
url = string.sub(url, 1, -2)
end
return url
';
return 301 $mwredirect;
}
include php5-fpm.conf;
fastcgi_split_path_info ^(/)(.*)$;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
8. Now, you should have a quite functional wiki, apart some missing images. Let’s add the UI images from the /skins subdirectory and the /extensions subdirectory at the same time (some extensions have JavaScript files or image files in their directories). Here are only allowed: the images, the JS files, the CSS and LESS files, and the .htc files (used by IE).
location ~ ^/(extensions|skins)/ {
location ~ \.(js|css|htc|less|png|svg|gif|jpg|xcf)$ {
allow all;
try_files $uri =403;
}
deny all;
}
9. Now we can allow integrated files of the /images subdirectory. Below are two variants depending if your wiki is public or private.
location ~ ^/images/ {
# Publicly accessible files
location ~ ^/images/(\.htaccess|README|lockdir.*)$ {
return 404;
}
location ~ /$ {
deny all;
}
try_files $uri =404;
# Private files for a private wiki
#include php5-fpm.conf;
#fastcgi_split_path_info ^(/images/)(.*)$;
#fastcgi_param SCRIPT_FILENAME $document_root/img_auth.php;
#fastcgi_param PATH_INFO $fastcgi_path_info;
}
10. To finish, we can add /robots.txt and /favicon.ico.
location ~ ^/(robots.txt|favicon.ico)$ {
try_files $uri =404;
}
== Complements ==
a. If you cannot install the Lua module in nginx, directly-entered old URLs (coming from external places like emails, other websites, user bookmarks, etc.) will work but will be displayed as old URLs ("/index.php?title=Main_Page&action=edit"). Once the user click on some link on the wiki, s/he will see new URLs.
b. To avoid MediaWiki to create URLs with remaining "title=" parameters, MediaWiki core should be patched in many places: in all forms where there is a <nowiki><input type="hidden" name="title" … /></nowiki> HTML tag and possibly in other places. Possibly some bug should be created, at least to give an option to natively create beautiful URLs.
c. MediaWiki update maintenance: nothing from the MediaWiki configuration side, apart if you modify MediaWiki core (it is not recommanded to facilitate updates). Probably the changed configuration parameters will stay backward-compatible for some long time since most were introduced in pre 1.1.0 MediaWiki versions. Possibly some PHP scripts must be added in the point 6 in future MediaWiki releases, see the entry points in your Special:Version page or on [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org. Possibly you can want to change the files enumerated in point 9 (this list is better from a security point of view, but this requires maintenance over time).
d. The nginx configuration above was done with strict security considerations in order to remove all entry points to system files, but this requires maintenance over time. You can want to soften these security checks:
# add more PHP scripts in point 6, see [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org
# add more media files extensions in point 8, or even acess all files in the "extensions" and "skins" subdirectories, or at the contrary blacklist some file extensions (e.g. mainly .php files)
# remove the list of files in point 9, this is probably harmless from a security point of view
e. The list in point 10 could be changed depending of specific needs. For example, you could change the location of the favicon (see [https://www.mediawiki.org/wiki/Manual:$wgFavicon $wgFavicon]), or you can add a file /sitemap.xml, etc. Additionally some MediaWiki extensions or core features propose to manage some "metadata system files" like /robots.txt or /sitemap.xml; if you want to use these features, you could have to create other "location" in nginx configuration with some wrapper to PHP file, similarly to the wrapper for "/images/" in the case of a private wiki.
f. As of MediaWiki 1.23, the entry points on the page Special:Version will show "[ ]" for "index.php", this can be considered a ''bug'': the case where "index.php" is completely removed is not expected :)
g. An easier way to remove most of the index.php is to use [[:mw:Manual:$wgActionPaths|$wgActionPaths]]. With this configuration setting, the 'edit' action on this page would be <tt>[{{SERVER}}/edit/{{FULLPAGENAMEE}} http://{{SERVERNAME}}/edit/{{FULLPAGENAMEE}}]</tt> instead of <tt>[{{SERVER}}/{{FULLPAGENAMEE}}?action=edit http://{{SERVERNAME}}/{{FULLPAGENAMEE}}?action=edit]</tt>. I have no opinion on what is better. It can be kept in mind that some browsers might remove the address part after the "?"; in these browsers, the action would or would not be displayed. Note : how does MediaWiki react with $wgActionPaths when there are (e.g.) "action=edit" and "section=0": is it "/edit/Title?section=0" or "/index.php?title=Title&action=edit§ion=0"?
== Conclusion ==
# Now the URLs are "/Main_Page", "/Main_Page?action=history", "/Main_Page?printable=yes", etc.
# Non-latin alphabets benefit of the "real characters" rendering of the browser in the URL
# The system is backward-compatible with existing URLs, and old URLs are rewritten if you have installed the Lua part in the nginx configuration.
# Your articles can have a wide range of titles and are not limited by system files, e.g. you can write articles about "Robots.txt", "Images", "Skins", or "Index.php" (NB: the initial capital).
# Except whitelisted system files and subdirectories, nobody can access to the underlying system files: e.g. "includes/Title.php" is considered as an article, as well as "LocalSettings.php", hence an attacker does not have a direct access to the system files and s/he will have to deal with MediaWiki before attacking PHP files.
03570137c0bdf1de0f81eeba154fcb9ac854b005
Modèle:Tutorial
10
20
4237
86
2017-08-28T21:52:43Z
80.23.199.34
0
wikitext
text/x-wiki
Nice post. I study one thing more difficult on completely different blogs everyday. fbgaedfceebcdkda
e4d6b684703c39190b7ed8ee3d2b5f03d890fab1
4238
4237
2017-09-04T21:55:29Z
95.46.126.3
0
wikitext
text/x-wiki
The principle isn't to artificially turn out to be effective, cfdfekbebdcdfdda
db61d487c9255c0c96179f7be82cad5700b04117
4239
4238
2017-09-08T22:29:15Z
212.233.61.70
0
wikitext
text/x-wiki
This actually answered my drawback, thank you! kbgkkdcdcfdagdca
6ed158757689c6e9f0adc02d7fbe6df488ddd66a
4240
4239
2017-09-13T07:16:59Z
95.46.126.3
0
wikitext
text/x-wiki
reverse lookup cell phone free christian louboutin shoes you are dcfedgdddgeacgea
8703c703a1798a506d0fc6e9ed1bc2ba5170cfcb
658076
4240
2020-03-07T16:44:04Z
Seb35
1
revert
wikitext
text/x-wiki
<div style="top:0px; right:0px; float:right; z-index:0; background-color:white; border:1px solid black; padding: 0px 10px;">
Langue : {{#switch:{{lc:{{{lang|fr}}}}}|fr|en={{lc:{{{lang|fr}}}}}|#default=inconnue}}<br />
Statut : {{#switch:{{lc:{{{status|stable}}}}}|stable=stable|draft|brouillon=brouillon|#default=inconnu}}
</div>
<includeonly>[[Catégorie:{{#switch:{{lc:{{{lang|fr}}}}}|fr|en={{lc:{{{lang|fr}}}}}|#default=Langue inconnue}}]]
[[Catégorie:{{#switch:{{lc:{{{status|stable}}}}}|stable=Stable|draft|brouillon=Brouillon|#default=Statut inconnu}}]]</includeonly>
74b931e6dbb079e73ba71c22d5376031210c342f
Btrfs
0
189
167788
2019-02-02T16:52:10Z
Seb35
1
begin of notes about btrfs
wikitext
text/x-wiki
I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, unsuccessfully for now. Here are my steps if it can be useful to others.
WARNING: this is EXPERIMENTAL and could cause DATA LOSS.
== Create the server ==
On https://v4.gandi.net, create a new server [https://v4.gandi.net/admin/iaas/vm/create] with e.g. 1 proc, 256 Mio RAM, 1 system disk, Ubuntu 18.04 LTS.
Update the packages:
apt update && apt upgrade -y
On https://v4.gandi.net, stop the server, open the page about the system disk, clone the system disk with another name, and attach this cloned disk to the server, start the server.
== Convert to btrfs ==
The package btrfs-progs currently does not contain btrfs-convert ([https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) because the risk of data loss is too great. Then we need to compile btrfs-progs.
Install dependencies:
apt install gcc g++ libblkid-dev liblzo2-dev zlib1g-dev libzstd-dev asciidoc xmlto libattr1-dev libext2fs-dev pkg-config python3-dev python3-setuptools
Download and compile btrfs-progs ([https://btrfs.wiki.kernel.org/index.php/Changelog changelog], [https://www.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/ releases]):
wget https://mirrors.edge.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/btrfs-progs-v4.20.1.tar.gz
tar xfz btrfs-progs-v4.20.1.tar.gz
cd btrfs-progs-v4.20.1
./configure --with-convert=ext2
make
make install
cd ..
rm -rf btrfs-progs-v4.20.1 btrfs-progs-v4.20.1.tar.gz
eaabd272b90b424ace3d67d42a26d433b27fe740
167796
167788
2019-02-02T17:12:49Z
Seb35
1
wikitext
text/x-wiki
I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, unsuccessfully for now. Here are my steps if it can be useful to others.
WARNING: this is EXPERIMENTAL and could cause DATA LOSS.
== Create the server ==
On https://v4.gandi.net, create a new server [https://v4.gandi.net/admin/iaas/vm/create] with e.g. 1 proc, 256 Mio RAM, 1 system disk, Ubuntu 18.04 LTS.
Update the packages:
apt update && apt upgrade -y
On https://v4.gandi.net, stop the server, open the page about the system disk, clone the system disk with another name, and attach this cloned disk to the server, start the server.
== Convert to btrfs ==
:''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]''
The package btrfs-progs currently does not contain btrfs-convert ([https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) because the risk of data loss is too great. Then we need to compile btrfs-progs.
Install dependencies:
apt install gcc g++ libblkid-dev liblzo2-dev zlib1g-dev libzstd-dev asciidoc xmlto libattr1-dev libext2fs-dev pkg-config python3-dev python3-setuptools
Download and compile btrfs-progs ([https://btrfs.wiki.kernel.org/index.php/Changelog changelog], [https://www.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/ releases]):
wget https://mirrors.edge.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/btrfs-progs-v4.20.1.tar.gz
tar xfz btrfs-progs-v4.20.1.tar.gz
cd btrfs-progs-v4.20.1
./configure --with-convert=ext2
make
make install
cd ..
rm -rf btrfs-progs-v4.20.1 btrfs-progs-v4.20.1.tar.gz
Display the active root filesystem, and you will be able to deduce what is the cloned filesystem:
ls /dev/xvd*
mount|grep xvd
blkid -o value -s TYPE /dev/xvda1 # and the same for others
Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs:
fsck.ext4 -f /dev/xvdb1
btrfs-convert -p /dev/xvdb1
Here, I obtained the following error:
root@test:~# btrfs-convert -p /dev/xvda1
create btrfs filesystem:
blocksize: 4096
nodesize: 16384
features: extref, skinny-metadata (default)
creating ext2 image file
creating btrfs metadata
Unable to find block group for 0 27081]
Unable to find block group for 0
Unable to find block group for 0
ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1
btrfs-convert(+0x11b5a)[0x559c159c1b5a]
btrfs-convert(+0x1589b)[0x559c159c589b]
btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401]
btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c]
btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4]
btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92]
btrfs-convert(+0x10349)[0x559c159c0349]
btrfs-convert(+0x1135f)[0x559c159c135f]
btrfs-convert(main+0x1f59)[0x559c159bdefb]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97]
btrfs-convert(_start+0x2a)[0x559c159bb5ca]
Aborted
According to [https://github.com/kdave/btrfs-progs/issues/123], it can be worked around:
btrfs-convert -d -p /dev/xvdb1
Then, mount the filesystem and delete the old ext4 snapshot:
mount /dev/xvdb1 /mnt
btrfs subvolume delete /mnt/ext2_saved
== Promote as root filesystem ==
Not successful after a first try with [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions] and I abandonned here, see also [https://wiki.gentoo.org/wiki/Btrfs/System_Root_Guide].
473c2bb95e1b1582f3e0445c10f819d1628b2347
167802
167796
2019-02-02T17:16:52Z
Seb35
1
ref
wikitext
text/x-wiki
I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, unsuccessfully for now. Here are my steps if it can be useful to others.
WARNING: this is EXPERIMENTAL and could cause DATA LOSS.
== Create the server ==
On https://v4.gandi.net, create a new server [https://v4.gandi.net/admin/iaas/vm/create] with e.g. 1 proc, 256 Mio RAM, 1 system disk, Ubuntu 18.04 LTS.
Update the packages:
apt update && apt upgrade -y
On https://v4.gandi.net, stop the server, open the page about the system disk, clone the system disk with another name, and attach this cloned disk to the server, start the server.
== Convert to btrfs ==
:''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]''
The package btrfs-progs currently does not contain btrfs-convert ([https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) because the risk of data loss is too great. Then we need to compile btrfs-progs.
Install dependencies:
apt install gcc g++ libblkid-dev liblzo2-dev zlib1g-dev libzstd-dev asciidoc xmlto libattr1-dev libext2fs-dev pkg-config python3-dev python3-setuptools
Download and compile btrfs-progs ([https://btrfs.wiki.kernel.org/index.php/Changelog changelog], [https://www.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/ releases]):
wget https://mirrors.edge.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/btrfs-progs-v4.20.1.tar.gz
tar xfz btrfs-progs-v4.20.1.tar.gz
cd btrfs-progs-v4.20.1
./configure --with-convert=ext2
make
make install
cd ..
rm -rf btrfs-progs-v4.20.1 btrfs-progs-v4.20.1.tar.gz
Display the active root filesystem, and you will be able to deduce what is the cloned filesystem:
ls /dev/xvd*
mount|grep xvd
blkid -o value -s TYPE /dev/xvda1 # and the same for others
Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs:
fsck.ext4 -f /dev/xvdb1
btrfs-convert -p /dev/xvdb1
Here, I obtained the following error:
root@test:~# btrfs-convert -p /dev/xvda1
create btrfs filesystem:
blocksize: 4096
nodesize: 16384
features: extref, skinny-metadata (default)
creating ext2 image file
creating btrfs metadata
Unable to find block group for 0 27081]
Unable to find block group for 0
Unable to find block group for 0
ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1
btrfs-convert(+0x11b5a)[0x559c159c1b5a]
btrfs-convert(+0x1589b)[0x559c159c589b]
btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401]
btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c]
btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4]
btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92]
btrfs-convert(+0x10349)[0x559c159c0349]
btrfs-convert(+0x1135f)[0x559c159c135f]
btrfs-convert(main+0x1f59)[0x559c159bdefb]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97]
btrfs-convert(_start+0x2a)[0x559c159bb5ca]
Aborted
According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around:
btrfs-convert -d -p /dev/xvdb1
Then, mount the filesystem and delete the old ext4 snapshot:
mount /dev/xvdb1 /mnt
btrfs subvolume delete /mnt/ext2_saved
== Promote as root filesystem ==
Not successful after a first try with [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions] and I abandonned here, see also [https://wiki.gentoo.org/wiki/Btrfs/System_Root_Guide].
389e0fd332f4d9afe8b2f03dca2e2c265aa62b5e
171893
167802
2019-02-08T08:46:02Z
Seb35
1
slightly different for Debian 9, added other steps if unsucessful
wikitext
text/x-wiki
I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, unsuccessfully for now. Here are my steps if it can be useful to others.
WARNING: this is EXPERIMENTAL and could cause DATA LOSS.
== Create the server ==
On https://v4.gandi.net, create a new server [https://v4.gandi.net/admin/iaas/vm/create] with e.g. 1 proc, 256 Mio RAM, 1 system disk, Ubuntu 18.04 LTS or Debian 9.
Update the packages:
apt update && apt upgrade -y
On https://v4.gandi.net, stop the server, open the page about the system disk, clone the system disk with another name, and attach this cloned disk to the server, start the server.
== Convert to btrfs ==
:''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]''
The package btrfs-progs currently does not contain btrfs-convert ([https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) because the risk of data loss is too great. Then we need to compile btrfs-progs.
Install dependencies (''Ubuntu 18.04 LTS''):
apt install gcc g++ libblkid-dev liblzo2-dev zlib1g-dev libzstd-dev asciidoc xmlto libattr1-dev pkg-config python3-dev python3-setuptools libext2fs-dev
OR Install dependencies (''Debian 9''):
apt install gcc g++ libblkid-dev liblzo2-dev zlib1g-dev libzstd-dev asciidoc xmlto libattr1-dev pkg-config python3-dev python3-setuptools e2fslibs-dev
Download and compile btrfs-progs ([https://btrfs.wiki.kernel.org/index.php/Changelog changelog], [https://www.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/ releases]):
wget https://mirrors.edge.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/btrfs-progs-v4.20.1.tar.gz
tar xfz btrfs-progs-v4.20.1.tar.gz
cd btrfs-progs-v4.20.1
./configure --with-convert=ext2
make
make install
cd ..
rm -rf btrfs-progs-v4.20.1 btrfs-progs-v4.20.1.tar.gz
Display the active root filesystem, and you will be able to deduce what is the cloned filesystem:
ls /dev/xvd*
mount|grep xvd
blkid -o value -s TYPE /dev/xvda1 # and the same for others
Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs:
fsck.ext4 -f /dev/xvdb1
btrfs-convert -p /dev/xvdb1
Here, I obtained the following error:
root@test:~# btrfs-convert -p /dev/xvda1
create btrfs filesystem:
blocksize: 4096
nodesize: 16384
features: extref, skinny-metadata (default)
creating ext2 image file
creating btrfs metadata
Unable to find block group for 0 27081]
Unable to find block group for 0
Unable to find block group for 0
ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1
btrfs-convert(+0x11b5a)[0x559c159c1b5a]
btrfs-convert(+0x1589b)[0x559c159c589b]
btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401]
btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c]
btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4]
btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92]
btrfs-convert(+0x10349)[0x559c159c0349]
btrfs-convert(+0x1135f)[0x559c159c135f]
btrfs-convert(main+0x1f59)[0x559c159bdefb]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97]
btrfs-convert(_start+0x2a)[0x559c159bb5ca]
Aborted
According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around:
btrfs-convert -d -p /dev/xvdb1
or even:
btrfs-convert -n -d -p /dev/xvdb1
Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space, expanded after its original size was 30 Gio (=4 Gio free space)).
Then, mount the filesystem and delete the old ext4 snapshot:
mount /dev/xvdb1 /mnt
btrfs subvolume delete /mnt/ext2_saved
== Promote as root filesystem ==
Not successful after a first try with [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions] and I abandonned here, see also [https://wiki.gentoo.org/wiki/Btrfs/System_Root_Guide].
07ef96f089c1bb57e4e163756165d1d3067a89d4
171901
171893
2019-02-08T08:59:19Z
Seb35
1
+time spent, +defrag after conversion
wikitext
text/x-wiki
I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, unsuccessfully for now. Here are my steps if it can be useful to others.
WARNING: this is EXPERIMENTAL and could cause DATA LOSS.
== Create the server ==
On https://v4.gandi.net, create a new server [https://v4.gandi.net/admin/iaas/vm/create] with e.g. 1 proc, 256 Mio RAM, 1 system disk, Ubuntu 18.04 LTS or Debian 9.
Update the packages:
apt update && apt upgrade -y
On https://v4.gandi.net, stop the server, open the page about the system disk, clone the system disk with another name, and attach this cloned disk to the server, start the server.
== Convert to btrfs ==
:''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]''
The package btrfs-progs currently does not contain btrfs-convert ([https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) because the risk of data loss is too great. Then we need to compile btrfs-progs.
Install dependencies (''Ubuntu 18.04 LTS''):
apt install gcc g++ libblkid-dev liblzo2-dev zlib1g-dev libzstd-dev asciidoc xmlto libattr1-dev pkg-config python3-dev python3-setuptools libext2fs-dev
OR Install dependencies (''Debian 9''):
apt install gcc g++ libblkid-dev liblzo2-dev zlib1g-dev libzstd-dev asciidoc xmlto libattr1-dev pkg-config python3-dev python3-setuptools e2fslibs-dev
Download and compile btrfs-progs ([https://btrfs.wiki.kernel.org/index.php/Changelog changelog], [https://www.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/ releases]):
wget https://mirrors.edge.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/btrfs-progs-v4.20.1.tar.gz
tar xfz btrfs-progs-v4.20.1.tar.gz
cd btrfs-progs-v4.20.1
./configure --with-convert=ext2
make
make install
cd ..
rm -rf btrfs-progs-v4.20.1 btrfs-progs-v4.20.1.tar.gz
Display the active root filesystem, and you will be able to deduce what is the cloned filesystem:
ls /dev/xvd*
mount|grep xvd
blkid -o value -s TYPE /dev/xvda1 # and the same for others
Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs:
fsck.ext4 -f /dev/xvdb1
btrfs-convert -p /dev/xvdb1
Here, I obtained the following error:
root@test:~# btrfs-convert -p /dev/xvda1
create btrfs filesystem:
blocksize: 4096
nodesize: 16384
features: extref, skinny-metadata (default)
creating ext2 image file
creating btrfs metadata
Unable to find block group for 0 27081]
Unable to find block group for 0
Unable to find block group for 0
ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1
btrfs-convert(+0x11b5a)[0x559c159c1b5a]
btrfs-convert(+0x1589b)[0x559c159c589b]
btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401]
btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c]
btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4]
btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92]
btrfs-convert(+0x10349)[0x559c159c0349]
btrfs-convert(+0x1135f)[0x559c159c135f]
btrfs-convert(main+0x1f59)[0x559c159bdefb]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97]
btrfs-convert(_start+0x2a)[0x559c159bb5ca]
Aborted
According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files)
btrfs-convert -d -p /dev/xvdb1
or even:
btrfs-convert -n -d -p /dev/xvdb1
Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space, expanded after its original size was 30 Gio (=4 Gio free space)).
Then, mount the filesystem and delete the old ext4 snapshot:
mount /dev/xvdb1 /mnt
btrfs subvolume delete /mnt/ext2_saved
btrfs filesystem defrag -r /mnt # could take dozen of minuts
btrfs balance start /mnt
== Promote as root filesystem ==
Not successful after a first try with [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions] and I abandonned here, see also [https://wiki.gentoo.org/wiki/Btrfs/System_Root_Guide].
a31dc4e1d62ec79a3044d5319d6fbd5ef4b34610
171906
171901
2019-02-08T09:16:38Z
Seb35
1
+manpage
wikitext
text/x-wiki
I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, unsuccessfully for now. Here are my steps if it can be useful to others.
WARNING: this is EXPERIMENTAL and could cause DATA LOSS.
== Create the server ==
On https://v4.gandi.net, create a new server [https://v4.gandi.net/admin/iaas/vm/create] with e.g. 1 proc, 256 Mio RAM, 1 system disk, Ubuntu 18.04 LTS or Debian 9.
Update the packages:
apt update && apt upgrade -y
On https://v4.gandi.net, stop the server, open the page about the system disk, clone the system disk with another name, and attach this cloned disk to the server, start the server.
== Convert to btrfs ==
:''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]''
The package btrfs-progs currently does not contain btrfs-convert ([https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) because the risk of data loss is too great. Then we need to compile btrfs-progs.
Install dependencies (''Ubuntu 18.04 LTS''):
apt install gcc g++ libblkid-dev liblzo2-dev zlib1g-dev libzstd-dev asciidoc xmlto libattr1-dev pkg-config python3-dev python3-setuptools libext2fs-dev
OR Install dependencies (''Debian 9''):
apt install gcc g++ libblkid-dev liblzo2-dev zlib1g-dev libzstd-dev asciidoc xmlto libattr1-dev pkg-config python3-dev python3-setuptools e2fslibs-dev
Download and compile btrfs-progs ([https://btrfs.wiki.kernel.org/index.php/Changelog changelog], [https://www.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/ releases]):
wget https://mirrors.edge.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/btrfs-progs-v4.20.1.tar.gz
tar xfz btrfs-progs-v4.20.1.tar.gz
cd btrfs-progs-v4.20.1
./configure --with-convert=ext2
make
make install
cd ..
rm -rf btrfs-progs-v4.20.1 btrfs-progs-v4.20.1.tar.gz
Display the active root filesystem, and you will be able to deduce what is the cloned filesystem:
ls /dev/xvd*
mount|grep xvd
blkid -o value -s TYPE /dev/xvda1 # and the same for others
Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert])
fsck.ext4 -f /dev/xvdb1
btrfs-convert -p /dev/xvdb1
Here, I obtained the following error:
root@test:~# btrfs-convert -p /dev/xvda1
create btrfs filesystem:
blocksize: 4096
nodesize: 16384
features: extref, skinny-metadata (default)
creating ext2 image file
creating btrfs metadata
Unable to find block group for 0 27081]
Unable to find block group for 0
Unable to find block group for 0
ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1
btrfs-convert(+0x11b5a)[0x559c159c1b5a]
btrfs-convert(+0x1589b)[0x559c159c589b]
btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401]
btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c]
btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4]
btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92]
btrfs-convert(+0x10349)[0x559c159c0349]
btrfs-convert(+0x1135f)[0x559c159c135f]
btrfs-convert(main+0x1f59)[0x559c159bdefb]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97]
btrfs-convert(_start+0x2a)[0x559c159bb5ca]
Aborted
According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files)
btrfs-convert -d -p /dev/xvdb1
or even:
btrfs-convert -n -d -p /dev/xvdb1
Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space, expanded after its original size was 30 Gio (=4 Gio free space)).
Then, mount the filesystem and delete the old ext4 snapshot:
mount /dev/xvdb1 /mnt
btrfs subvolume delete /mnt/ext2_saved
btrfs filesystem defrag -r /mnt # could take dozen of minuts
btrfs balance start /mnt
== Promote as root filesystem ==
Not successful after a first try with [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions] and I abandonned here, see also [https://wiki.gentoo.org/wiki/Btrfs/System_Root_Guide].
47ad9e0059379c8c0136ce435863095ba2b561dc
172161
171906
2019-02-08T17:12:00Z
Seb35
1
successful
wikitext
text/x-wiki
I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others.
WARNING: this is EXPERIMENTAL and could cause DATA LOSS.
== Create the server ==
On https://v4.gandi.net, create a new server [https://v4.gandi.net/admin/iaas/vm/create] with e.g. 1 proc, 256 Mio RAM, 1 system disk, Ubuntu 18.04 LTS or Debian 9.
Update the packages:
apt update && apt upgrade -y
On https://v4.gandi.net, stop the server, open the page about the system disk, clone the system disk with another name, and attach this cloned disk to the server, start the server.
== Convert to btrfs ==
:''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]''
The package btrfs-progs currently does not contain btrfs-convert ([https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) because the risk of data loss is too great. Then we need to compile btrfs-progs.
Install dependencies (''Ubuntu 18.04 LTS''):
apt install gcc g++ libblkid-dev liblzo2-dev zlib1g-dev libzstd-dev asciidoc xmlto libattr1-dev pkg-config python3-dev python3-setuptools libext2fs-dev
OR Install dependencies (''Debian 9''):
apt install gcc g++ libblkid-dev liblzo2-dev zlib1g-dev libzstd-dev asciidoc xmlto libattr1-dev pkg-config python3-dev python3-setuptools e2fslibs-dev
Download and compile btrfs-progs ([https://btrfs.wiki.kernel.org/index.php/Changelog changelog], [https://www.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/ releases]):
wget https://mirrors.edge.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/btrfs-progs-v4.20.1.tar.gz
tar xfz btrfs-progs-v4.20.1.tar.gz
cd btrfs-progs-v4.20.1
./configure --with-convert=ext2
make
make install
cd ..
rm -rf btrfs-progs-v4.20.1 btrfs-progs-v4.20.1.tar.gz
Display the active root filesystem, and you will be able to deduce what is the cloned filesystem:
ls /dev/xvd*
mount|grep xvd
blkid -o value -s TYPE /dev/xvda1 # and the same for others
Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert])
fsck.ext4 -f /dev/xvdb1
btrfs-convert -p /dev/xvdb1
Here, I obtained the following error:
root@test:~# btrfs-convert -p /dev/xvda1
create btrfs filesystem:
blocksize: 4096
nodesize: 16384
features: extref, skinny-metadata (default)
creating ext2 image file
creating btrfs metadata
Unable to find block group for 0 27081]
Unable to find block group for 0
Unable to find block group for 0
ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1
btrfs-convert(+0x11b5a)[0x559c159c1b5a]
btrfs-convert(+0x1589b)[0x559c159c589b]
btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401]
btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c]
btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4]
btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92]
btrfs-convert(+0x10349)[0x559c159c0349]
btrfs-convert(+0x1135f)[0x559c159c135f]
btrfs-convert(main+0x1f59)[0x559c159bdefb]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97]
btrfs-convert(_start+0x2a)[0x559c159bb5ca]
Aborted
According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files)
btrfs-convert -d -p /dev/xvdb1
or even:
btrfs-convert -n -d -p /dev/xvdb1
Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space, expanded after its original size was 30 Gio (=4 Gio free space)).
Then, mount the filesystem and delete the old ext4 snapshot:
mount /dev/xvdb1 /mnt
btrfs subvolume delete /mnt/ext2_saved
btrfs filesystem defrag -r /mnt # could take dozen of minuts
btrfs balance start /mnt # could take hours
== Promote as root filesystem ==
:''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]''
Enter the chrooted system:
for i in dev dev/pts proc sys ; do mount --bind /$i /mnt/$i ; done
chroot /mnt
blkid|grep xvdb1
vi /etc/fstab
Edit the root filesystem with: (the UUID is from the command blkid)
UUID=a74f5787-aee1-4981-b7e6-fbd3cb6ac919 / btrfs defaults 0 1
(in vi, type "dd" to remove a line, "i" to enter in edit mode, Esc to quit edit mode, ":x" to save and quit.)
vi /etc/grub.d/00_header
Comment the line:
#if [ -n "\${have_grubenv}" ]; then if [ -z "\${boot_once}" ]; then save_env recordfail; fi; fi
Update grub:
grub-install /dev/xvdb
update-grub
Quit:
exit
exit
== Define the cooked disk as boot disk ==
In Gandi V4 interface, stop the server, select the cooked disk as boot disk of this server (or detach the cooked disk and attach it as boot disk on another server).
df -hT
It should show something like:
/dev/xvda1 btrfs 50G 32G 19G 63% /
715619d29dd9afe766743360472f88d2dd97cf0f
172163
172161
2019-02-08T17:13:58Z
Seb35
1
/* Promote as root filesystem */
wikitext
text/x-wiki
I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others.
WARNING: this is EXPERIMENTAL and could cause DATA LOSS.
== Create the server ==
On https://v4.gandi.net, create a new server [https://v4.gandi.net/admin/iaas/vm/create] with e.g. 1 proc, 256 Mio RAM, 1 system disk, Ubuntu 18.04 LTS or Debian 9.
Update the packages:
apt update && apt upgrade -y
On https://v4.gandi.net, stop the server, open the page about the system disk, clone the system disk with another name, and attach this cloned disk to the server, start the server.
== Convert to btrfs ==
:''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]''
The package btrfs-progs currently does not contain btrfs-convert ([https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) because the risk of data loss is too great. Then we need to compile btrfs-progs.
Install dependencies (''Ubuntu 18.04 LTS''):
apt install gcc g++ libblkid-dev liblzo2-dev zlib1g-dev libzstd-dev asciidoc xmlto libattr1-dev pkg-config python3-dev python3-setuptools libext2fs-dev
OR Install dependencies (''Debian 9''):
apt install gcc g++ libblkid-dev liblzo2-dev zlib1g-dev libzstd-dev asciidoc xmlto libattr1-dev pkg-config python3-dev python3-setuptools e2fslibs-dev
Download and compile btrfs-progs ([https://btrfs.wiki.kernel.org/index.php/Changelog changelog], [https://www.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/ releases]):
wget https://mirrors.edge.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/btrfs-progs-v4.20.1.tar.gz
tar xfz btrfs-progs-v4.20.1.tar.gz
cd btrfs-progs-v4.20.1
./configure --with-convert=ext2
make
make install
cd ..
rm -rf btrfs-progs-v4.20.1 btrfs-progs-v4.20.1.tar.gz
Display the active root filesystem, and you will be able to deduce what is the cloned filesystem:
ls /dev/xvd*
mount|grep xvd
blkid -o value -s TYPE /dev/xvda1 # and the same for others
Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert])
fsck.ext4 -f /dev/xvdb1
btrfs-convert -p /dev/xvdb1
Here, I obtained the following error:
root@test:~# btrfs-convert -p /dev/xvda1
create btrfs filesystem:
blocksize: 4096
nodesize: 16384
features: extref, skinny-metadata (default)
creating ext2 image file
creating btrfs metadata
Unable to find block group for 0 27081]
Unable to find block group for 0
Unable to find block group for 0
ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1
btrfs-convert(+0x11b5a)[0x559c159c1b5a]
btrfs-convert(+0x1589b)[0x559c159c589b]
btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401]
btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c]
btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4]
btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92]
btrfs-convert(+0x10349)[0x559c159c0349]
btrfs-convert(+0x1135f)[0x559c159c135f]
btrfs-convert(main+0x1f59)[0x559c159bdefb]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97]
btrfs-convert(_start+0x2a)[0x559c159bb5ca]
Aborted
According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files)
btrfs-convert -d -p /dev/xvdb1
or even:
btrfs-convert -n -d -p /dev/xvdb1
Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space, expanded after its original size was 30 Gio (=4 Gio free space)).
Then, mount the filesystem and delete the old ext4 snapshot:
mount /dev/xvdb1 /mnt
btrfs subvolume delete /mnt/ext2_saved
btrfs filesystem defrag -r /mnt # could take dozen of minuts
btrfs balance start /mnt # could take hours
== Promote as root filesystem ==
:''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]''
Enter the chrooted system:
for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done
chroot /mnt
blkid|grep xvdb1
vi /etc/fstab
Edit the root filesystem with: (the UUID is from the command blkid)
UUID=a74f5787-aee1-4981-b7e6-fbd3cb6ac919 / btrfs defaults 0 1
(in vi, type "dd" to remove a line, "i" to enter in edit mode, Esc to quit edit mode, ":x" to save and quit.)
vi /etc/grub.d/00_header
Comment the line:
#if [ -n "\${have_grubenv}" ]; then if [ -z "\${boot_once}" ]; then save_env recordfail; fi; fi
Update grub:
grub-install /dev/xvdb
update-grub
Quit:
exit
for i in dev dev/pts proc sys; do umount /mnt/$i; done
umount /mnt
exit
== Define the cooked disk as boot disk ==
In Gandi V4 interface, stop the server, select the cooked disk as boot disk of this server (or detach the cooked disk and attach it as boot disk on another server).
df -hT
It should show something like:
/dev/xvda1 btrfs 50G 32G 19G 63% /
02d37aa6b1493e6805ef698228e032c18ae9c373
172181
172163
2019-02-08T17:48:40Z
Seb35
1
/* Define the cooked disk as boot disk */
wikitext
text/x-wiki
I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others.
WARNING: this is EXPERIMENTAL and could cause DATA LOSS.
== Create the server ==
On https://v4.gandi.net, create a new server [https://v4.gandi.net/admin/iaas/vm/create] with e.g. 1 proc, 256 Mio RAM, 1 system disk, Ubuntu 18.04 LTS or Debian 9.
Update the packages:
apt update && apt upgrade -y
On https://v4.gandi.net, stop the server, open the page about the system disk, clone the system disk with another name, and attach this cloned disk to the server, start the server.
== Convert to btrfs ==
:''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]''
The package btrfs-progs currently does not contain btrfs-convert ([https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) because the risk of data loss is too great. Then we need to compile btrfs-progs.
Install dependencies (''Ubuntu 18.04 LTS''):
apt install gcc g++ libblkid-dev liblzo2-dev zlib1g-dev libzstd-dev asciidoc xmlto libattr1-dev pkg-config python3-dev python3-setuptools libext2fs-dev
OR Install dependencies (''Debian 9''):
apt install gcc g++ libblkid-dev liblzo2-dev zlib1g-dev libzstd-dev asciidoc xmlto libattr1-dev pkg-config python3-dev python3-setuptools e2fslibs-dev
Download and compile btrfs-progs ([https://btrfs.wiki.kernel.org/index.php/Changelog changelog], [https://www.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/ releases]):
wget https://mirrors.edge.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/btrfs-progs-v4.20.1.tar.gz
tar xfz btrfs-progs-v4.20.1.tar.gz
cd btrfs-progs-v4.20.1
./configure --with-convert=ext2
make
make install
cd ..
rm -rf btrfs-progs-v4.20.1 btrfs-progs-v4.20.1.tar.gz
Display the active root filesystem, and you will be able to deduce what is the cloned filesystem:
ls /dev/xvd*
mount|grep xvd
blkid -o value -s TYPE /dev/xvda1 # and the same for others
Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert])
fsck.ext4 -f /dev/xvdb1
btrfs-convert -p /dev/xvdb1
Here, I obtained the following error:
root@test:~# btrfs-convert -p /dev/xvda1
create btrfs filesystem:
blocksize: 4096
nodesize: 16384
features: extref, skinny-metadata (default)
creating ext2 image file
creating btrfs metadata
Unable to find block group for 0 27081]
Unable to find block group for 0
Unable to find block group for 0
ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1
btrfs-convert(+0x11b5a)[0x559c159c1b5a]
btrfs-convert(+0x1589b)[0x559c159c589b]
btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401]
btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c]
btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4]
btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92]
btrfs-convert(+0x10349)[0x559c159c0349]
btrfs-convert(+0x1135f)[0x559c159c135f]
btrfs-convert(main+0x1f59)[0x559c159bdefb]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97]
btrfs-convert(_start+0x2a)[0x559c159bb5ca]
Aborted
According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files)
btrfs-convert -d -p /dev/xvdb1
or even:
btrfs-convert -n -d -p /dev/xvdb1
Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space, expanded after its original size was 30 Gio (=4 Gio free space)).
Then, mount the filesystem and delete the old ext4 snapshot:
mount /dev/xvdb1 /mnt
btrfs subvolume delete /mnt/ext2_saved
btrfs filesystem defrag -r /mnt # could take dozen of minuts
btrfs balance start /mnt # could take hours
== Promote as root filesystem ==
:''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]''
Enter the chrooted system:
for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done
chroot /mnt
blkid|grep xvdb1
vi /etc/fstab
Edit the root filesystem with: (the UUID is from the command blkid)
UUID=a74f5787-aee1-4981-b7e6-fbd3cb6ac919 / btrfs defaults 0 1
(in vi, type "dd" to remove a line, "i" to enter in edit mode, Esc to quit edit mode, ":x" to save and quit.)
vi /etc/grub.d/00_header
Comment the line:
#if [ -n "\${have_grubenv}" ]; then if [ -z "\${boot_once}" ]; then save_env recordfail; fi; fi
Update grub:
grub-install /dev/xvdb
update-grub
Quit:
exit
for i in dev dev/pts proc sys; do umount /mnt/$i; done
umount /mnt
exit
== Define the cooked disk as boot disk ==
In Gandi V4 interface, stop the server, select the cooked disk as boot disk of this server (or detach the cooked disk and attach it as boot disk on another server).
Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)).
df -hT
It should show something like:
/dev/xvda1 btrfs 50G 32G 19G 63% /
085fd7183c465a1847bf42e718c2d2e80e3c1ad3
429813
172181
2019-09-11T21:49:51Z
Seb35
1
/* Convert to btrfs */ update: btrfs-convert is included in recent Debian
wikitext
text/x-wiki
I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others.
WARNING: this is EXPERIMENTAL and could cause DATA LOSS.
== Create the server ==
On https://v4.gandi.net, create a new server [https://v4.gandi.net/admin/iaas/vm/create] with e.g. 1 proc, 256 Mio RAM, 1 system disk, Ubuntu 18.04 LTS or Debian 9.
Update the packages:
apt update && apt upgrade -y
On https://v4.gandi.net, stop the server, open the page about the system disk, clone the system disk with another name, and attach this cloned disk to the server, start the server.
== Convert to btrfs ==
:''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]''
The package btrfs-progs currently does not contain btrfs-convert ([https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) because the risk of data loss is too great. Then we need to compile btrfs-progs.
Update: btrfs-convert is included in Debian 10 buster backports and in Debian 11 bullseye.
Install dependencies (''Ubuntu 18.04 LTS''):
apt install gcc g++ libblkid-dev liblzo2-dev zlib1g-dev libzstd-dev asciidoc xmlto libattr1-dev pkg-config python3-dev python3-setuptools libext2fs-dev
OR Install dependencies (''Debian 9''):
apt install gcc g++ libblkid-dev liblzo2-dev zlib1g-dev libzstd-dev asciidoc xmlto libattr1-dev pkg-config python3-dev python3-setuptools e2fslibs-dev
Download and compile btrfs-progs ([https://btrfs.wiki.kernel.org/index.php/Changelog changelog], [https://www.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/ releases]):
wget https://mirrors.edge.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/btrfs-progs-v4.20.1.tar.gz
tar xfz btrfs-progs-v4.20.1.tar.gz
cd btrfs-progs-v4.20.1
./configure --with-convert=ext2
make
make install
cd ..
rm -rf btrfs-progs-v4.20.1 btrfs-progs-v4.20.1.tar.gz
Display the active root filesystem, and you will be able to deduce what is the cloned filesystem:
ls /dev/xvd*
mount|grep xvd
blkid -o value -s TYPE /dev/xvda1 # and the same for others
Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert])
fsck.ext4 -f /dev/xvdb1
btrfs-convert -p /dev/xvdb1
Here, I obtained the following error:
root@test:~# btrfs-convert -p /dev/xvda1
create btrfs filesystem:
blocksize: 4096
nodesize: 16384
features: extref, skinny-metadata (default)
creating ext2 image file
creating btrfs metadata
Unable to find block group for 0 27081]
Unable to find block group for 0
Unable to find block group for 0
ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1
btrfs-convert(+0x11b5a)[0x559c159c1b5a]
btrfs-convert(+0x1589b)[0x559c159c589b]
btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401]
btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c]
btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4]
btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92]
btrfs-convert(+0x10349)[0x559c159c0349]
btrfs-convert(+0x1135f)[0x559c159c135f]
btrfs-convert(main+0x1f59)[0x559c159bdefb]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97]
btrfs-convert(_start+0x2a)[0x559c159bb5ca]
Aborted
According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files)
btrfs-convert -d -p /dev/xvdb1
or even:
btrfs-convert -n -d -p /dev/xvdb1
Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space, expanded after its original size was 30 Gio (=4 Gio free space)).
Then, mount the filesystem and delete the old ext4 snapshot:
mount /dev/xvdb1 /mnt
btrfs subvolume delete /mnt/ext2_saved
btrfs filesystem defrag -r /mnt # could take dozen of minuts
btrfs balance start /mnt # could take hours
== Promote as root filesystem ==
:''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]''
Enter the chrooted system:
for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done
chroot /mnt
blkid|grep xvdb1
vi /etc/fstab
Edit the root filesystem with: (the UUID is from the command blkid)
UUID=a74f5787-aee1-4981-b7e6-fbd3cb6ac919 / btrfs defaults 0 1
(in vi, type "dd" to remove a line, "i" to enter in edit mode, Esc to quit edit mode, ":x" to save and quit.)
vi /etc/grub.d/00_header
Comment the line:
#if [ -n "\${have_grubenv}" ]; then if [ -z "\${boot_once}" ]; then save_env recordfail; fi; fi
Update grub:
grub-install /dev/xvdb
update-grub
Quit:
exit
for i in dev dev/pts proc sys; do umount /mnt/$i; done
umount /mnt
exit
== Define the cooked disk as boot disk ==
In Gandi V4 interface, stop the server, select the cooked disk as boot disk of this server (or detach the cooked disk and attach it as boot disk on another server).
Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)).
df -hT
It should show something like:
/dev/xvda1 btrfs 50G 32G 19G 63% /
a532f72be33ef675185112a900642e2aea573faa
658077
429813
2020-09-21T13:02:14Z
Seb35
1
detail
wikitext
text/x-wiki
I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others.
WARNING: this is EXPERIMENTAL and could cause DATA LOSS.
== Create the server ==
On https://v4.gandi.net, create a new server [https://v4.gandi.net/admin/iaas/vm/create] with e.g. 1 proc, 256 Mio RAM, 1 system disk, Ubuntu 18.04 LTS or Debian 9.
Update the packages:
apt update && apt upgrade -y
On https://v4.gandi.net, stop the server, open the page about the system disk, clone the system disk with another name, and attach this cloned disk to the server, start the server.
== Convert to btrfs ==
:''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]''
The package btrfs-progs currently does not contain btrfs-convert ([https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) because the risk of data loss is too great. Then we need to compile btrfs-progs.
Update: btrfs-convert is included in Debian 10 buster backports and in Debian 11 bullseye.
Install dependencies (''Ubuntu 18.04 LTS''):
apt install gcc g++ libblkid-dev liblzo2-dev zlib1g-dev libzstd-dev asciidoc xmlto libattr1-dev pkg-config python3-dev python3-setuptools libext2fs-dev
OR Install dependencies (''Debian 9''):
apt install gcc g++ libblkid-dev liblzo2-dev zlib1g-dev libzstd-dev asciidoc xmlto libattr1-dev pkg-config python3-dev python3-setuptools e2fslibs-dev
Download and compile btrfs-progs ([https://btrfs.wiki.kernel.org/index.php/Changelog changelog], [https://www.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/ releases]):
wget https://mirrors.edge.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/btrfs-progs-v4.20.1.tar.gz
tar xfz btrfs-progs-v4.20.1.tar.gz
cd btrfs-progs-v4.20.1
./configure --with-convert=ext2
make
make install
cd ..
rm -rf btrfs-progs-v4.20.1 btrfs-progs-v4.20.1.tar.gz
Display the active root filesystem, and you will be able to deduce what is the cloned filesystem:
ls /dev/xvd*
mount|grep xvd
blkid -o value -s TYPE /dev/xvda1 # and the same for others
Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert])
fsck.ext4 -f /dev/xvdb1
btrfs-convert -p /dev/xvdb1
Here, I obtained the following error:
root@test:~# btrfs-convert -p /dev/xvda1
create btrfs filesystem:
blocksize: 4096
nodesize: 16384
features: extref, skinny-metadata (default)
creating ext2 image file
creating btrfs metadata
Unable to find block group for 0 27081]
Unable to find block group for 0
Unable to find block group for 0
ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1
btrfs-convert(+0x11b5a)[0x559c159c1b5a]
btrfs-convert(+0x1589b)[0x559c159c589b]
btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401]
btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c]
btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4]
btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92]
btrfs-convert(+0x10349)[0x559c159c0349]
btrfs-convert(+0x1135f)[0x559c159c135f]
btrfs-convert(main+0x1f59)[0x559c159bdefb]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97]
btrfs-convert(_start+0x2a)[0x559c159bb5ca]
Aborted
According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files)
btrfs-convert -d -p /dev/xvdb1
or even:
btrfs-convert -n -d -p /dev/xvdb1
Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space, expanded after its original size was 30 Gio (=4 Gio free space)).
Then, mount the filesystem and delete the old ext4 snapshot:
mount /dev/xvdb1 /mnt
btrfs subvolume delete /mnt/ext2_saved
btrfs filesystem defrag -r /mnt # could take dozen of minuts
btrfs balance start /mnt # could take hours
== Promote as root filesystem ==
:''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]''
Enter the chrooted system:
for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done
chroot /mnt
blkid|grep xvdb1
vi /etc/fstab
Edit the root filesystem with: (the UUID is from the command blkid)
UUID=a74f5787-aee1-4981-b7e6-fbd3cb6ac919 / btrfs defaults 0 1
(in vi, type "dd" to remove a line, "i" to enter in edit mode, Esc to quit edit mode, ":x" to save and quit.)
vi /etc/grub.d/00_header
Comment the line:
#if [ -n "\${have_grubenv}" ]; then if [ -z "\${boot_once}" ]; then save_env recordfail; fi; fi
Update grub:
grub-install /dev/xvdb
update-grub
Quit:
exit
for i in dev/pts dev proc sys; do umount /mnt/$i; done
umount /mnt
exit
== Define the cooked disk as boot disk ==
In Gandi V4 interface, stop the server, select the cooked disk as boot disk of this server (or detach the cooked disk and attach it as boot disk on another server).
Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)).
df -hT
It should show something like:
/dev/xvda1 btrfs 50G 32G 19G 63% /
744dc946abb2127cd503caf7ff7d45ec58dd75a4
658078
658077
2020-09-21T16:50:41Z
Seb35
1
update for Debian 10 buster
wikitext
text/x-wiki
I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others.
WARNING: this is EXPERIMENTAL and could cause DATA LOSS.
This was updated for Debian 10 buster + GandiV5 and works probably also for Debian 11 bullseye. An older version was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4.
== Create the server ==
On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 Mio RAM, 1 system disk, Debian 10 buster.
Update the packages:
apt update && apt upgrade -y
Install grub-xen instead of grub-efi-amd64:
cp -a /etc/default/grub /root/grub
apt purge grub-efi-amd64-bin && apt install grub-xen
mv /root/grub /etc/default/grub
Define backports for Debian 10 (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11):
echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list
Install btrfs-progs:
apt update && apt install -t buster-backports btrfs-progs
On GandiV5, stop the server, open the page about the system disk, clone the system disk with another (definitive) name, and attach this cloned disk to the server, start the server.
== Convert to btrfs ==
:''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]''
Display the active root filesystem, and you will be able to deduce what is the cloned filesystem:
ls /dev/xvd*
mount|grep xvd
blkid -o value -s TYPE /dev/xvdb1 # and the same for others
Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert])
fsck.ext4 -f /dev/xvdb1
btrfs-convert -p /dev/xvdb1
Here, I obtained the following error:
root@test:~# btrfs-convert -p /dev/xvdb1
create btrfs filesystem:
blocksize: 4096
nodesize: 16384
features: extref, skinny-metadata (default)
creating ext2 image file
creating btrfs metadata
Unable to find block group for 0 27081]
Unable to find block group for 0
Unable to find block group for 0
ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1
btrfs-convert(+0x11b5a)[0x559c159c1b5a]
btrfs-convert(+0x1589b)[0x559c159c589b]
btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401]
btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c]
btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4]
btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92]
btrfs-convert(+0x10349)[0x559c159c0349]
btrfs-convert(+0x1135f)[0x559c159c135f]
btrfs-convert(main+0x1f59)[0x559c159bdefb]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97]
btrfs-convert(_start+0x2a)[0x559c159bb5ca]
Aborted
According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files)
btrfs-convert -d -p /dev/xvdb1
or even:
btrfs-convert -n -d -p /dev/xvdb1
Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)).
Then, mount the filesystem and delete the old ext4 snapshot:
mount /dev/xvdb1 /mnt
btrfs subvolume delete /mnt/ext2_saved
btrfs filesystem defrag -r /mnt # could take dozen of minuts
btrfs balance start /mnt # could take hours
== Promote as root filesystem ==
:''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]''
Enter the chrooted system:
for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done
chroot /mnt
blkid|grep xvdb1
vi /etc/fstab
Edit the root filesystem with: (the UUID is from the command blkid)
UUID=a74f5787-aee1-4981-b7e6-fbd3cb6ac919 / btrfs defaults 0 1
(in vi, type "dd" to remove a line, "i" to enter in edit mode, Esc to quit edit mode, ":x" to save and quit.)
Update grub:
grub-install --target x86_64-xen /dev/xvdb
update-grub
Quit:
exit
for i in dev/pts dev proc sys; do umount /mnt/$i; done
umount /mnt
exit
== Define the cooked disk as boot disk ==
In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start".
Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)).
df -hT
It should show something like:
/dev/xvda1 btrfs 50G 32G 19G 63% /
Delete the old root disk.
b0808c17a93b8966d5c828a0c8f2d45f6ee9e887
658079
658078
2020-09-21T17:32:05Z
Seb35
1
+lien vers l’archive
wikitext
text/x-wiki
I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others.
WARNING: this is EXPERIMENTAL and could cause DATA LOSS.
This was updated for Debian 10 buster + GandiV5 and works probably also for Debian 11 bullseye. An [{{fullurl:Btrfs|oldid=658077}} older version] was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4.
== Create the server ==
On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 Mio RAM, 1 system disk, Debian 10 buster.
Update the packages:
apt update && apt upgrade -y
Install grub-xen instead of grub-efi-amd64:
cp -a /etc/default/grub /root/grub
apt purge grub-efi-amd64-bin && apt install grub-xen
mv /root/grub /etc/default/grub
Define backports for Debian 10 (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11):
echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list
Install btrfs-progs:
apt update && apt install -t buster-backports btrfs-progs
On GandiV5, stop the server, open the page about the system disk, clone the system disk with another (definitive) name, and attach this cloned disk to the server, start the server.
== Convert to btrfs ==
:''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]''
Display the active root filesystem, and you will be able to deduce what is the cloned filesystem:
ls /dev/xvd*
mount|grep xvd
blkid -o value -s TYPE /dev/xvdb1 # and the same for others
Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert])
fsck.ext4 -f /dev/xvdb1
btrfs-convert -p /dev/xvdb1
Here, I obtained the following error:
root@test:~# btrfs-convert -p /dev/xvdb1
create btrfs filesystem:
blocksize: 4096
nodesize: 16384
features: extref, skinny-metadata (default)
creating ext2 image file
creating btrfs metadata
Unable to find block group for 0 27081]
Unable to find block group for 0
Unable to find block group for 0
ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1
btrfs-convert(+0x11b5a)[0x559c159c1b5a]
btrfs-convert(+0x1589b)[0x559c159c589b]
btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401]
btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c]
btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4]
btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92]
btrfs-convert(+0x10349)[0x559c159c0349]
btrfs-convert(+0x1135f)[0x559c159c135f]
btrfs-convert(main+0x1f59)[0x559c159bdefb]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97]
btrfs-convert(_start+0x2a)[0x559c159bb5ca]
Aborted
According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files)
btrfs-convert -d -p /dev/xvdb1
or even:
btrfs-convert -n -d -p /dev/xvdb1
Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)).
Then, mount the filesystem and delete the old ext4 snapshot:
mount /dev/xvdb1 /mnt
btrfs subvolume delete /mnt/ext2_saved
btrfs filesystem defrag -r /mnt # could take dozen of minuts
btrfs balance start /mnt # could take hours
== Promote as root filesystem ==
:''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]''
Enter the chrooted system:
for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done
chroot /mnt
blkid|grep xvdb1
vi /etc/fstab
Edit the root filesystem with: (the UUID is from the command blkid)
UUID=a74f5787-aee1-4981-b7e6-fbd3cb6ac919 / btrfs defaults 0 1
(in vi, type "dd" to remove a line, "i" to enter in edit mode, Esc to quit edit mode, ":x" to save and quit.)
Update grub:
grub-install --target x86_64-xen /dev/xvdb
update-grub
Quit:
exit
for i in dev/pts dev proc sys; do umount /mnt/$i; done
umount /mnt
exit
== Define the cooked disk as boot disk ==
In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start".
Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)).
df -hT
It should show something like:
/dev/xvda1 btrfs 50G 32G 19G 63% /
Delete the old root disk.
6c58a1b3a8cee2d2ca70151d5b9e92b13f20ab8e
Unicode
0
192
429787
2019-09-11T21:26:36Z
Seb35
1
notes about UTF-16
wikitext
text/x-wiki
== [[:wikipedia:UTF-16|UTF-16]] ==
1 or 2 code units of 16 bits = 2 bytes
If 2 code units, first one is in 0xD800-0xDBFF, second one is in 0xDC00-0xDFFF.
* First one: 6 fixed bits (0b110110) then 4 bits encoding the Unicode plan (minus one: 1-16 become 0-15) then 6 strong bits inside the plan
* Second one: 6 fixed bits (0b110111) then 10 bits inside the plan
Non-private astral planes 0x10000-0xEFFFF are encoded in UTF-16: [\uD800-\uDAFF\uDB00-\uDB7F][\uDC00-\uDFFF]
Astral planes are encoded in UTF-16: [\uD800-\uDBFF][\uDC00-\uDFFF]
<!--
== [[:wikipedia:UTF-32|UTF-32]] ==
Number of unused bits in UTF-32:
<math>1 - \frac{log_2(17 \times 2^{16})}{log_2(2^{32})} = 1 - \frac{log_2(17) + 16}{32} \approx 0,372266786 \approx 37,2266786 %</math>
-->
f711a61c5436a551db449ff65b6c927f17fe8730
429834
429787
2019-09-11T22:13:41Z
Seb35
1
additional note
wikitext
text/x-wiki
== [[:wikipedia:UTF-16|UTF-16]] ==
1 or 2 code units of 16 bits = 2 bytes
If 2 code units, first one is in 0xD800-0xDBFF, second one is in 0xDC00-0xDFFF.
* First one: 6 fixed bits (0b110110) then 4 bits encoding the Unicode plan (minus one: 1-16 become 0-15) then 6 strong bits inside the plan - note that the plan number is splitted between the two last bits of the first byte and the two first bits of the second byte
* Second one: 6 fixed bits (0b110111) then 10 bits inside the plan
Non-private astral planes 0x10000-0xEFFFF are encoded in UTF-16: [\uD800-\uDAFF\uDB00-\uDB7F][\uDC00-\uDFFF]
Astral planes are encoded in UTF-16: [\uD800-\uDBFF][\uDC00-\uDFFF]
<!--
== [[:wikipedia:UTF-32|UTF-32]] ==
Number of unused bits in UTF-32:
<math>1 - \frac{log_2(17 \times 2^{16})}{log_2(2^{32})} = 1 - \frac{log_2(17) + 16}{32} \approx 0,372266786 \approx 37,2266786 %</math>
-->
be769b3cc36b0dcbd49014183ddeadf2f8f794ad
429875
429834
2019-09-11T22:46:05Z
Seb35
1
wikitext
text/x-wiki
== [[:wikipedia:UTF-16|UTF-16]] ==
1 or 2 code units of 16 bits = 2 bytes
If 2 code units, first one is in 0xD800-0xDBFF, second one is in 0xDC00-0xDFFF.
* First one: 6 fixed bits (0b110110) then 4 bits encoding the Unicode plan (minus one: 1-16 become 0-15) then 6 first bits from inside the plan - note that the plan number is splitted between the two last bits of the first byte and the two first bits of the second byte
* Second one: 6 fixed bits (0b110111) then 10 last bits from inside the plan
Non-private astral planes 0x10000-0xEFFFF are encoded in UTF-16: [\uD800-\uDAFF\uDB00-\uDB7F][\uDC00-\uDFFF]
Astral planes are encoded in UTF-16: [\uD800-\uDBFF][\uDC00-\uDFFF]
<!--
== [[:wikipedia:UTF-32|UTF-32]] ==
Number of unused bits in UTF-32:
<math>1 - \frac{log_2(17 \times 2^{16})}{log_2(2^{32})} = 1 - \frac{log_2(17) + 16}{32} \approx 0,372266786 \approx 37,2266786 %</math>
-->
97423dcd8ccab89d3fa8cfe95ea71ab6d5d9e5c8
Btrfs
0
189
658080
658079
2020-09-24T18:09:25Z
Seb35
1
simplify the process
wikitext
text/x-wiki
I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others.
WARNING: this is EXPERIMENTAL and could cause DATA LOSS.
This was updated on 2020-09-24 for Debian 10 buster + GandiV5 and works probably also for Debian 11 bullseye. An [{{fullurl:Btrfs|oldid=658077}} older version] was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4.
== Create the server ==
On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 Mio RAM, 1 system disk, Debian 10 buster.
Update the packages:
apt update && apt upgrade -y
Define backports for Debian 10 (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11):
echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list
Install btrfs-progs:
apt update && apt install -t buster-backports btrfs-progs
On GandiV5, stop the server, open the page about the system disk, clone the system disk with another (definitive) name, and attach this cloned disk to the server, start the server.
== Convert to btrfs ==
:''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]''
Display the active root filesystem, and you will be able to deduce what is the cloned filesystem:
ls /dev/xvd*
mount|grep xvd
blkid
Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert])
fsck.ext4 -f /dev/xvdb1 # optional
btrfs-convert -p /dev/xvdb1
Here, I obtained the following error:
root@test:~# btrfs-convert -p /dev/xvdb1
create btrfs filesystem:
blocksize: 4096
nodesize: 16384
features: extref, skinny-metadata (default)
creating ext2 image file
creating btrfs metadata
Unable to find block group for 0 27081]
Unable to find block group for 0
Unable to find block group for 0
ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1
btrfs-convert(+0x11b5a)[0x559c159c1b5a]
btrfs-convert(+0x1589b)[0x559c159c589b]
btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401]
btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c]
btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4]
btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92]
btrfs-convert(+0x10349)[0x559c159c0349]
btrfs-convert(+0x1135f)[0x559c159c135f]
btrfs-convert(main+0x1f59)[0x559c159bdefb]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97]
btrfs-convert(_start+0x2a)[0x559c159bb5ca]
Aborted
According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files)
btrfs-convert -d -p /dev/xvdb1
or even:
btrfs-convert -n -d -p /dev/xvdb1
Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)).
Then, mount the filesystem and delete the old ext4 snapshot:
mount /dev/xvdb1 /mnt
btrfs subvolume delete /mnt/ext2_saved
btrfs filesystem defrag -r /mnt # could take dozen of minuts
btrfs balance start /mnt # could take hours
== Promote as root filesystem ==
:''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]''
Enter the chrooted system:
for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done
chroot /mnt
blkid|grep xvdb1
vi /etc/fstab
Edit the root filesystem with: (the UUID is from the command blkid)
UUID=a74f5787-aee1-4981-b7e6-fbd3cb6ac919 / btrfs defaults 0 1
(in vi, type "dd" to remove a line, "i" to enter in edit mode, Esc to quit edit mode, ":x" to save and quit.)
Update grub:
update-grub
Change the reference of the root device (will be xvda1 when it will be the root device):
sed -i s/xvdb1/xvda1/g /boot/grub/grub.cfg
Quit:
exit
for i in dev/pts dev proc sys; do umount /mnt/$i; done
umount /mnt
exit
== Define the cooked disk as boot disk ==
In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start".
Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)).
df -hT
It should show something like:
/dev/xvda1 btrfs 50G 32G 19G 63% /
Delete the old root disk.
You can delete the packages grub-efi-amd64 and grub-efi-amd64-bin since they are not used, but keep /etc/default/grub with Gandi customisations:
cp -a /etc/default/grub /root/grub
apt-get purge -y grub-efi-amd64 grub-efi-amd64-bin
mv /root/grub /etc/default/grub
update-grub # to check it still work and you should reboot now to be sure it reboots correctly
== External links ==
* [https://wiki.xen.org/wiki/PvGrub2 PvGrub2 on Xen wiki]
de0ca70ae82c1cc2a2be0ec174ad29f08394426c
658115
658080
2021-06-09T13:31:35Z
Seb35
1
/* Promote as root filesystem */
wikitext
text/x-wiki
I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others.
WARNING: this is EXPERIMENTAL and could cause DATA LOSS.
This was updated on 2020-09-24 for Debian 10 buster + GandiV5 and works probably also for Debian 11 bullseye. An [{{fullurl:Btrfs|oldid=658077}} older version] was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4.
== Create the server ==
On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 Mio RAM, 1 system disk, Debian 10 buster.
Update the packages:
apt update && apt upgrade -y
Define backports for Debian 10 (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11):
echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list
Install btrfs-progs:
apt update && apt install -t buster-backports btrfs-progs
On GandiV5, stop the server, open the page about the system disk, clone the system disk with another (definitive) name, and attach this cloned disk to the server, start the server.
== Convert to btrfs ==
:''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]''
Display the active root filesystem, and you will be able to deduce what is the cloned filesystem:
ls /dev/xvd*
mount|grep xvd
blkid
Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert])
fsck.ext4 -f /dev/xvdb1 # optional
btrfs-convert -p /dev/xvdb1
Here, I obtained the following error:
root@test:~# btrfs-convert -p /dev/xvdb1
create btrfs filesystem:
blocksize: 4096
nodesize: 16384
features: extref, skinny-metadata (default)
creating ext2 image file
creating btrfs metadata
Unable to find block group for 0 27081]
Unable to find block group for 0
Unable to find block group for 0
ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1
btrfs-convert(+0x11b5a)[0x559c159c1b5a]
btrfs-convert(+0x1589b)[0x559c159c589b]
btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401]
btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c]
btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4]
btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92]
btrfs-convert(+0x10349)[0x559c159c0349]
btrfs-convert(+0x1135f)[0x559c159c135f]
btrfs-convert(main+0x1f59)[0x559c159bdefb]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97]
btrfs-convert(_start+0x2a)[0x559c159bb5ca]
Aborted
According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files)
btrfs-convert -d -p /dev/xvdb1
or even:
btrfs-convert -n -d -p /dev/xvdb1
Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)).
Then, mount the filesystem and delete the old ext4 snapshot:
mount /dev/xvdb1 /mnt
btrfs subvolume delete /mnt/ext2_saved
btrfs filesystem defrag -r /mnt # could take dozen of minuts
btrfs balance start /mnt # could take hours
== Promote as root filesystem ==
:''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]''
Enter the chrooted system:
for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done
chroot /mnt
blkid|grep xvdb1
vi /etc/fstab
Edit the root filesystem with: (the UUID is from the command blkid)
UUID=a74f5787-aee1-4981-b7e6-fbd3cb6ac919 / btrfs defaults 0 1
There are 3 things to change on this line: UUID, ext4 → btrfs, and the options now to "defaults".
(in vi, type "dd" to remove a line, "i" to enter in edit mode, Esc to quit edit mode, ":x" to save and quit.)
Update grub:
update-grub
Change the reference of the root device (will be xvda1 when it will be the root device):
sed -i s/xvdb1/xvda1/g /boot/grub/grub.cfg
Quit:
exit
for i in dev/pts dev proc sys; do umount /mnt/$i; done
umount /mnt
exit
== Define the cooked disk as boot disk ==
In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start".
Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)).
df -hT
It should show something like:
/dev/xvda1 btrfs 50G 32G 19G 63% /
Delete the old root disk.
You can delete the packages grub-efi-amd64 and grub-efi-amd64-bin since they are not used, but keep /etc/default/grub with Gandi customisations:
cp -a /etc/default/grub /root/grub
apt-get purge -y grub-efi-amd64 grub-efi-amd64-bin
mv /root/grub /etc/default/grub
update-grub # to check it still work and you should reboot now to be sure it reboots correctly
== External links ==
* [https://wiki.xen.org/wiki/PvGrub2 PvGrub2 on Xen wiki]
0c1702a091a7d67e7fc72916b06f957f78973493
658116
658115
2021-06-09T13:34:31Z
Seb35
1
wikitext
text/x-wiki
I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others.
WARNING: this is EXPERIMENTAL and could cause DATA LOSS.
This was updated on 2020-09-24 for Debian 10 buster + GandiV5 and works probably also for Debian 11 bullseye. An [{{fullurl:Btrfs|oldid=658077}} older version] was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4.
== Create the server ==
On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 Mio RAM, 1 system disk, Debian 10 buster.
Update the packages:
apt update && apt upgrade -y
Define backports for Debian 10 (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11):
echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list
Install btrfs-progs:
apt update && apt install -t buster-backports btrfs-progs
On GandiV5, stop the server, open the page about the system disk, clone the system disk with another (definitive) name, and attach this cloned disk to the server, start the server.
== Convert to btrfs ==
:''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]''
Display the active root filesystem, and you will be able to deduce what is the cloned filesystem:
ls /dev/xvd*
mount|grep xvd
blkid
Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert])
fsck.ext4 -f /dev/xvdb1 # optional
btrfs-convert -p /dev/xvdb1
Here, I obtained the following error:
root@test:~# btrfs-convert -p /dev/xvdb1
create btrfs filesystem:
blocksize: 4096
nodesize: 16384
features: extref, skinny-metadata (default)
creating ext2 image file
creating btrfs metadata
Unable to find block group for 0 27081]
Unable to find block group for 0
Unable to find block group for 0
ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1
btrfs-convert(+0x11b5a)[0x559c159c1b5a]
btrfs-convert(+0x1589b)[0x559c159c589b]
btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401]
btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c]
btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4]
btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92]
btrfs-convert(+0x10349)[0x559c159c0349]
btrfs-convert(+0x1135f)[0x559c159c135f]
btrfs-convert(main+0x1f59)[0x559c159bdefb]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97]
btrfs-convert(_start+0x2a)[0x559c159bb5ca]
Aborted
According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files)
btrfs-convert -d -p /dev/xvdb1
or even:
btrfs-convert -n -d -p /dev/xvdb1
Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)).
Then, mount the filesystem and delete the old ext4 snapshot:
mount /dev/xvdb1 /mnt
btrfs subvolume delete /mnt/ext2_saved
btrfs filesystem defrag -r /mnt # could take dozen of minuts
btrfs balance start /mnt # could take hours
== Promote as root filesystem ==
:''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]''
Enter the chrooted system:
for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done
chroot /mnt
blkid|grep xvdb1
vi /etc/fstab
Edit the root filesystem with: (the UUID is from the command blkid)
UUID=a74f5787-aee1-4981-b7e6-fbd3cb6ac919 / btrfs defaults 0 1
There are 3 things to change on this line: UUID, ext4 → btrfs, and the options now to "defaults".
(in vi, type "dd" to remove a line, "i" to enter in edit mode, Esc to quit edit mode, ":x" to save and quit.)
Update grub:
update-grub
Change the reference of the root device (will be xvda1 when it will be the root device):
sed -i s/xvdb1/xvda1/g /boot/grub/grub.cfg
Quit:
exit
for i in dev/pts dev proc sys; do umount /mnt/$i; done
umount /mnt
exit
== Define the cooked disk as boot disk ==
In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start".
Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)).
df -hT
It should show something like:
/dev/xvda1 btrfs 50G 32G 19G 63% /
Delete the old root disk.
You can delete the packages grub-efi-amd64 and grub-efi-amd64-bin since they are not used, but keep /etc/default/grub with Gandi customisations:
cp -a /etc/default/grub /root/grub
apt-get purge -y grub-efi-amd64 grub-efi-amd64-bin
mv /root/grub /etc/default/grub
update-grub # to check it still work and you should reboot now to be sure it reboots correctly
== Troubleshootings ==
* During a conversion, the root filesystem was mounted read-only in btrfs; it was probably because I didn’t change the options "rw,noatime,errors=remount-ro" to "defaults"
== External links ==
* [https://wiki.xen.org/wiki/PvGrub2 PvGrub2 on Xen wiki]
b67bf673a2fc78ce4f5c4b2e7759797d6fad7c58
658133
658116
2022-02-02T20:42:06Z
Seb35
1
update for Debian 11 Bullseye
wikitext
text/x-wiki
I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others.
WARNING: this is EXPERIMENTAL and could cause DATA LOSS.
This was updated on 2020-09-24 for Debian 10 buster + GandiV5 and on 2022-02-02 for Debian 11 bullseye. An [{{fullurl:Btrfs|oldid=658077}} older version] was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4.
== Create the server ==
On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 Mio RAM, 1 system disk, Debian 10 buster.
Update the packages:
apt update && apt upgrade -y
For Debian 10 Buster (only), define backports (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11):
echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list
Install btrfs-progs:
apt update && apt install -t buster-backports btrfs-progs # Debian 10 Buster
apt update && apt install btrfs-progs # Debian 11 Bullseye
On GandiV5, stop the server, open the page about the system disk, clone the system disk with another (definitive) name, and attach this cloned disk to the server, start the server.
== Convert to btrfs ==
:''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]''
Display the active root filesystem, and you will be able to deduce what is the cloned filesystem: (beware: given the two filesystems have the same UUID, the mounted root filesystem could be /dev/xvdb1 – it happened once)
ls /dev/xvd*
mount|grep xvd
blkid
Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert])
fsck.ext4 -f /dev/xvdb1 # optional
btrfs-convert -p /dev/xvdb1
Here, I obtained the following error:
root@test:~# btrfs-convert -p /dev/xvdb1
create btrfs filesystem:
blocksize: 4096
nodesize: 16384
features: extref, skinny-metadata (default)
creating ext2 image file
creating btrfs metadata
Unable to find block group for 0 27081]
Unable to find block group for 0
Unable to find block group for 0
ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1
btrfs-convert(+0x11b5a)[0x559c159c1b5a]
btrfs-convert(+0x1589b)[0x559c159c589b]
btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401]
btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c]
btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4]
btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92]
btrfs-convert(+0x10349)[0x559c159c0349]
btrfs-convert(+0x1135f)[0x559c159c135f]
btrfs-convert(main+0x1f59)[0x559c159bdefb]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97]
btrfs-convert(_start+0x2a)[0x559c159bb5ca]
Aborted
According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files)
btrfs-convert -d -p /dev/xvdb1
or even:
btrfs-convert -n -d -p /dev/xvdb1
Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)).
Then, mount the filesystem and delete the old ext4 snapshot:
mount /dev/xvdb1 /mnt
btrfs subvolume delete /mnt/ext2_saved
btrfs filesystem defrag -r /mnt # could take dozen of minuts
btrfs balance start /mnt # could take hours
== Promote as root filesystem ==
:''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]''
Enter the chrooted system:
for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done
chroot /mnt
blkid|grep xvdb1
vi /etc/fstab
Edit the root filesystem with: (the UUID is from the command blkid)
UUID=a74f5787-aee1-4981-b7e6-fbd3cb6ac919 / btrfs defaults 0 1
There are 3 things to change on this line: UUID, ext4 → btrfs, and the options now to "defaults".
(in vi, type "dd" to remove a line, "i" to enter in edit mode, Esc to quit edit mode, ":x" to save and quit.)
Update grub:
update-grub
Change the reference of the root device (will be xvda1 when it will be the root device):
sed -i s/xvdb1/xvda1/g /boot/grub/grub.cfg
Quit:
exit
for i in dev/pts dev proc sys; do umount /mnt/$i; done
umount /mnt
exit
== Define the cooked disk as boot disk ==
In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start".
Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)).
df -hT
It should show something like:
/dev/xvda1 btrfs 50G 32G 19G 63% /
Delete the old root disk.
You can delete the packages grub-efi-amd64, grub-efi-amd64-bin, grub-pc, grub-pc-bin since they are not used, but keep /etc/default/grub with Gandi customisations:
cp -a /etc/default/grub /root/grub
apt-get purge -y grub-efi-amd64 grub-efi-amd64-bin grub-pc grub-pc-bin
mv /root/grub /etc/default/grub
apt-mark manual grub-common grub2-common
update-grub # to check it still work and you should reboot now to be sure it reboots correctly
== Troubleshootings ==
* During a conversion, the root filesystem was mounted read-only in btrfs; it was probably because I didn’t change the options "rw,noatime,errors=remount-ro" to "defaults"
== External links ==
* [https://wiki.xen.org/wiki/PvGrub2 PvGrub2 on Xen wiki]
7baf4fecf6e414804904b2f6f6d7a85e0debeb9a
658134
658133
2022-02-02T20:43:57Z
Seb35
1
typo
wikitext
text/x-wiki
I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others.
WARNING: this is EXPERIMENTAL and could cause DATA LOSS.
This was updated on 2020-09-24 for Debian 10 buster + GandiV5, and on 2022-02-02 for Debian 11 bullseye + GandiV5. An [{{fullurl:Btrfs|oldid=658077}} older version] was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4.
== Create the server ==
On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 Mio RAM, 1 system disk, Debian 10 buster or Debian 11 bullseye.
Update the packages:
apt update && apt upgrade -y
For Debian 10 buster (only), define backports (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11):
echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list
Install btrfs-progs:
apt update && apt install -t buster-backports btrfs-progs # Debian 10 buster
apt update && apt install btrfs-progs # Debian 11 bullseye
On GandiV5, stop the server, open the page about the system disk, clone the system disk with another (definitive) name, and attach this cloned disk to the server, start the server.
== Convert to btrfs ==
:''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]''
Display the active root filesystem, and you will be able to deduce what is the cloned filesystem: (beware: given the two filesystems have the same UUID, the mounted root filesystem could be /dev/xvdb1 – it happened once)
ls /dev/xvd*
mount|grep xvd
blkid
Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert])
fsck.ext4 -f /dev/xvdb1 # optional
btrfs-convert -p /dev/xvdb1
Here, I obtained the following error:
root@test:~# btrfs-convert -p /dev/xvdb1
create btrfs filesystem:
blocksize: 4096
nodesize: 16384
features: extref, skinny-metadata (default)
creating ext2 image file
creating btrfs metadata
Unable to find block group for 0 27081]
Unable to find block group for 0
Unable to find block group for 0
ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1
btrfs-convert(+0x11b5a)[0x559c159c1b5a]
btrfs-convert(+0x1589b)[0x559c159c589b]
btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401]
btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c]
btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4]
btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92]
btrfs-convert(+0x10349)[0x559c159c0349]
btrfs-convert(+0x1135f)[0x559c159c135f]
btrfs-convert(main+0x1f59)[0x559c159bdefb]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97]
btrfs-convert(_start+0x2a)[0x559c159bb5ca]
Aborted
According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files)
btrfs-convert -d -p /dev/xvdb1
or even:
btrfs-convert -n -d -p /dev/xvdb1
Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)).
Then, mount the filesystem and delete the old ext4 snapshot:
mount /dev/xvdb1 /mnt
btrfs subvolume delete /mnt/ext2_saved
btrfs filesystem defrag -r /mnt # could take dozen of minuts
btrfs balance start /mnt # could take hours
== Promote as root filesystem ==
:''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]''
Enter the chrooted system:
for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done
chroot /mnt
blkid|grep xvdb1
vi /etc/fstab
Edit the root filesystem with: (the UUID is from the command blkid)
UUID=a74f5787-aee1-4981-b7e6-fbd3cb6ac919 / btrfs defaults 0 1
There are 3 things to change on this line: UUID, ext4 → btrfs, and the options now to "defaults".
(in vi, type "dd" to remove a line, "i" to enter in edit mode, Esc to quit edit mode, ":x" to save and quit.)
Update grub:
update-grub
Change the reference of the root device (will be xvda1 when it will be the root device):
sed -i s/xvdb1/xvda1/g /boot/grub/grub.cfg
Quit:
exit
for i in dev/pts dev proc sys; do umount /mnt/$i; done
umount /mnt
exit
== Define the cooked disk as boot disk ==
In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start".
Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)).
df -hT
It should show something like:
/dev/xvda1 btrfs 50G 32G 19G 63% /
Delete the old root disk.
You can delete the packages grub-efi-amd64, grub-efi-amd64-bin, grub-pc, grub-pc-bin since they are not used, but keep /etc/default/grub with Gandi customisations:
cp -a /etc/default/grub /root/grub
apt-get purge -y grub-efi-amd64 grub-efi-amd64-bin grub-pc grub-pc-bin
mv /root/grub /etc/default/grub
apt-mark manual grub-common grub2-common
update-grub # to check it still work and you should reboot now to be sure it reboots correctly
== Troubleshootings ==
* During a conversion, the root filesystem was mounted read-only in btrfs; it was probably because I didn’t change the options "rw,noatime,errors=remount-ro" to "defaults"
== External links ==
* [https://wiki.xen.org/wiki/PvGrub2 PvGrub2 on Xen wiki]
d27d7e967893e29ae9e70e0c710d9f6eb969a9f0
658135
658134
2022-02-02T21:13:42Z
Seb35
1
+link to Wikipedia and dedicated wiki
wikitext
text/x-wiki
I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others. For an introduction, see [https://en.wikipedia.org/wiki/Btrfs Wikipedia article] and/or [https://btrfs.wiki.kernel.org the dedicated wiki].
WARNING: this is EXPERIMENTAL and could cause DATA LOSS.
This was updated on 2020-09-24 for Debian 10 buster + GandiV5, and on 2022-02-02 for Debian 11 bullseye + GandiV5. An [{{fullurl:Btrfs|oldid=658077}} older version] was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4.
== Create the server ==
On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 Mio RAM, 1 system disk, Debian 10 buster or Debian 11 bullseye.
Update the packages:
apt update && apt upgrade -y
For Debian 10 buster (only), define backports (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11):
echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list
Install btrfs-progs:
apt update && apt install -t buster-backports btrfs-progs # Debian 10 buster
apt update && apt install btrfs-progs # Debian 11 bullseye
On GandiV5, stop the server, open the page about the system disk, clone the system disk with another (definitive) name, and attach this cloned disk to the server, start the server.
== Convert to btrfs ==
:''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]''
Display the active root filesystem, and you will be able to deduce what is the cloned filesystem: (beware: given the two filesystems have the same UUID, the mounted root filesystem could be /dev/xvdb1 – it happened once)
ls /dev/xvd*
mount|grep xvd
blkid
Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert])
fsck.ext4 -f /dev/xvdb1 # optional
btrfs-convert -p /dev/xvdb1
Here, I obtained the following error:
root@test:~# btrfs-convert -p /dev/xvdb1
create btrfs filesystem:
blocksize: 4096
nodesize: 16384
features: extref, skinny-metadata (default)
creating ext2 image file
creating btrfs metadata
Unable to find block group for 0 27081]
Unable to find block group for 0
Unable to find block group for 0
ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1
btrfs-convert(+0x11b5a)[0x559c159c1b5a]
btrfs-convert(+0x1589b)[0x559c159c589b]
btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401]
btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c]
btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4]
btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92]
btrfs-convert(+0x10349)[0x559c159c0349]
btrfs-convert(+0x1135f)[0x559c159c135f]
btrfs-convert(main+0x1f59)[0x559c159bdefb]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97]
btrfs-convert(_start+0x2a)[0x559c159bb5ca]
Aborted
According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files)
btrfs-convert -d -p /dev/xvdb1
or even:
btrfs-convert -n -d -p /dev/xvdb1
Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)).
Then, mount the filesystem and delete the old ext4 snapshot:
mount /dev/xvdb1 /mnt
btrfs subvolume delete /mnt/ext2_saved
btrfs filesystem defrag -r /mnt # could take dozen of minuts
btrfs balance start /mnt # could take hours
== Promote as root filesystem ==
:''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]''
Enter the chrooted system:
for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done
chroot /mnt
blkid|grep xvdb1
vi /etc/fstab
Edit the root filesystem with: (the UUID is from the command blkid)
UUID=a74f5787-aee1-4981-b7e6-fbd3cb6ac919 / btrfs defaults 0 1
There are 3 things to change on this line: UUID, ext4 → btrfs, and the options now to "defaults".
(in vi, type "dd" to remove a line, "i" to enter in edit mode, Esc to quit edit mode, ":x" to save and quit.)
Update grub:
update-grub
Change the reference of the root device (will be xvda1 when it will be the root device):
sed -i s/xvdb1/xvda1/g /boot/grub/grub.cfg
Quit:
exit
for i in dev/pts dev proc sys; do umount /mnt/$i; done
umount /mnt
exit
== Define the cooked disk as boot disk ==
In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start".
Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)).
df -hT
It should show something like:
/dev/xvda1 btrfs 50G 32G 19G 63% /
Delete the old root disk.
You can delete the packages grub-efi-amd64, grub-efi-amd64-bin, grub-pc, grub-pc-bin since they are not used, but keep /etc/default/grub with Gandi customisations:
cp -a /etc/default/grub /root/grub
apt-get purge -y grub-efi-amd64 grub-efi-amd64-bin grub-pc grub-pc-bin
mv /root/grub /etc/default/grub
apt-mark manual grub-common grub2-common
update-grub # to check it still work and you should reboot now to be sure it reboots correctly
== Troubleshootings ==
* During a conversion, the root filesystem was mounted read-only in btrfs; it was probably because I didn’t change the options "rw,noatime,errors=remount-ro" to "defaults"
== External links ==
* [https://wiki.xen.org/wiki/PvGrub2 PvGrub2 on Xen wiki]
8665d780b6b8b6a7062564679e7604391e1759a6
658136
658135
2022-04-23T12:29:53Z
Seb35
1
small improvement to avoid launching the wrong disk
wikitext
text/x-wiki
I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others. For an introduction, see [https://en.wikipedia.org/wiki/Btrfs Wikipedia article] and/or [https://btrfs.wiki.kernel.org the dedicated wiki].
WARNING: this is EXPERIMENTAL and could cause DATA LOSS.
This was updated on 2020-09-24 for Debian 10 buster + GandiV5, and on 2022-02-02 for Debian 11 bullseye + GandiV5. An [{{fullurl:Btrfs|oldid=658077}} older version] was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4.
== Create the server ==
On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 Mio RAM, 1 system disk, Debian 10 buster or Debian 11 bullseye.
Update the packages:
apt update && apt upgrade -y
For Debian 10 buster (only), define backports (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11):
echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list
Install btrfs-progs:
apt update && apt install -t buster-backports btrfs-progs # Debian 10 buster
apt update && apt install btrfs-progs # Debian 11 bullseye
On GandiV5 :
# stop the server,
# open the page about the system disk,
# clone the system disk with another (definitive) name,
# start the server,
# attach this cloned disk to the server.
ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server).
== Convert to btrfs ==
:''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]''
Display the active root filesystem, and you will be able to deduce what is the cloned filesystem:
ls /dev/xvd*
mount|grep xvd
blkid
Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert])
fsck.ext4 -f /dev/xvdb1 # optional
btrfs-convert -p /dev/xvdb1
Here, I obtained the following error:
root@test:~# btrfs-convert -p /dev/xvdb1
create btrfs filesystem:
blocksize: 4096
nodesize: 16384
features: extref, skinny-metadata (default)
creating ext2 image file
creating btrfs metadata
Unable to find block group for 0 27081]
Unable to find block group for 0
Unable to find block group for 0
ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1
btrfs-convert(+0x11b5a)[0x559c159c1b5a]
btrfs-convert(+0x1589b)[0x559c159c589b]
btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401]
btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c]
btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4]
btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92]
btrfs-convert(+0x10349)[0x559c159c0349]
btrfs-convert(+0x1135f)[0x559c159c135f]
btrfs-convert(main+0x1f59)[0x559c159bdefb]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97]
btrfs-convert(_start+0x2a)[0x559c159bb5ca]
Aborted
According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files)
btrfs-convert -d -p /dev/xvdb1
or even:
btrfs-convert -n -d -p /dev/xvdb1
Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)).
Then, mount the filesystem and delete the old ext4 snapshot:
mount /dev/xvdb1 /mnt
btrfs subvolume delete /mnt/ext2_saved
btrfs filesystem defrag -r /mnt # could take dozen of minuts
btrfs balance start /mnt # could take hours
== Promote as root filesystem ==
:''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]''
Enter the chrooted system:
for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done
chroot /mnt
blkid|grep xvdb1
vi /etc/fstab
Edit the root filesystem with: (the UUID is from the command blkid)
UUID=a74f5787-aee1-4981-b7e6-fbd3cb6ac919 / btrfs defaults 0 1
There are 3 things to change on this line: UUID, ext4 → btrfs, and the options now to "defaults".
(in vi, type "dd" to remove a line, "i" to enter in edit mode, Esc to quit edit mode, ":x" to save and quit.)
Update grub:
update-grub
Change the reference of the root device (will be xvda1 when it will be the root device):
sed -i s/xvdb1/xvda1/g /boot/grub/grub.cfg
Quit:
exit
for i in dev/pts dev proc sys; do umount /mnt/$i; done
umount /mnt
exit
== Define the cooked disk as boot disk ==
In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start".
Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)).
df -hT
It should show something like:
/dev/xvda1 btrfs 50G 32G 19G 63% /
Delete the old root disk.
You can delete the packages grub-efi-amd64, grub-efi-amd64-bin, grub-pc, grub-pc-bin since they are not used, but keep /etc/default/grub with Gandi customisations:
cp -a /etc/default/grub /root/grub
apt-get purge -y grub-efi-amd64 grub-efi-amd64-bin grub-pc grub-pc-bin
mv /root/grub /etc/default/grub
apt-mark manual grub-common grub2-common
update-grub # to check it still work and you should reboot now to be sure it reboots correctly
== Troubleshootings ==
* During a conversion, the root filesystem was mounted read-only in btrfs; it was probably because I didn’t change the options "rw,noatime,errors=remount-ro" to "defaults"
== External links ==
* [https://wiki.xen.org/wiki/PvGrub2 PvGrub2 on Xen wiki]
05f7b038ad1709477f2bd24da0642791730a5fe6
658146
658136
2023-06-14T09:00:31Z
Seb35
1
simplify
wikitext
text/x-wiki
I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others. For an introduction, see [https://en.wikipedia.org/wiki/Btrfs Wikipedia article] and/or [https://btrfs.wiki.kernel.org the dedicated wiki].
WARNING: this is EXPERIMENTAL and could cause DATA LOSS.
This was updated on 2020-09-24 for Debian 10 buster + GandiV5, and on 2022-02-02 for Debian 11 bullseye + GandiV5. An [{{fullurl:Btrfs|oldid=658077}} older version] was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4.
== Create the server ==
On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 Mio RAM, 1 system disk, Debian 10 buster or Debian 11 bullseye.
For Debian 10 buster (only), define backports (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11):
echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list
Install btrfs-progs:
apt update && apt install -t buster-backports btrfs-progs # Debian 10 buster
apt update && apt install btrfs-progs # Debian 11 bullseye
On GandiV5 :
# stop the server,
# open the page about the system disk,
# clone the system disk with another (definitive) name,
# start the server,
# attach this cloned disk to the server.
ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server).
== Convert to btrfs ==
:''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]''
Display the active root filesystem, and you will be able to deduce what is the cloned filesystem:
ls /dev/xvd*
mount|grep xvd
blkid
Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert])
fsck.ext4 -f /dev/xvdb1 # optional
btrfs-convert -p /dev/xvdb1
Here, I obtained the following error:
root@test:~# btrfs-convert -p /dev/xvdb1
create btrfs filesystem:
blocksize: 4096
nodesize: 16384
features: extref, skinny-metadata (default)
creating ext2 image file
creating btrfs metadata
Unable to find block group for 0 27081]
Unable to find block group for 0
Unable to find block group for 0
ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1
btrfs-convert(+0x11b5a)[0x559c159c1b5a]
btrfs-convert(+0x1589b)[0x559c159c589b]
btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401]
btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c]
btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4]
btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92]
btrfs-convert(+0x10349)[0x559c159c0349]
btrfs-convert(+0x1135f)[0x559c159c135f]
btrfs-convert(main+0x1f59)[0x559c159bdefb]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97]
btrfs-convert(_start+0x2a)[0x559c159bb5ca]
Aborted
According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files)
btrfs-convert -d -p /dev/xvdb1
or even:
btrfs-convert -n -d -p /dev/xvdb1
Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)).
Then, mount the filesystem and delete the old ext4 snapshot:
mount /dev/xvdb1 /mnt
btrfs subvolume delete /mnt/ext2_saved
btrfs filesystem defrag -r /mnt # could take dozen of minuts
btrfs balance start /mnt # could take hours
== Promote as root filesystem ==
:''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]''
Enter the chrooted system:
for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done
chroot /mnt
blkid|grep xvdb1
vi /etc/fstab
Edit the root filesystem with: (the UUID is from the command blkid)
UUID=a74f5787-aee1-4981-b7e6-fbd3cb6ac919 / btrfs defaults 0 1
There are 3 things to change on this line: UUID, ext4 → btrfs, and the options now to "defaults".
(in vi, type "dd" to remove a line, "i" to enter in edit mode, Esc to quit edit mode, ":x" to save and quit.)
Update grub:
update-grub
Change the reference of the root device (will be xvda1 when it will be the root device):
sed -i s/xvdb1/xvda1/g /boot/grub/grub.cfg
Quit:
exit
for i in dev/pts dev proc sys; do umount /mnt/$i; done
umount /mnt
exit
== Define the cooked disk as boot disk ==
In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start".
Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)).
df -hT
It should show something like:
/dev/xvda1 btrfs 50G 32G 19G 63% /
Delete the old root disk.
You can delete the packages grub-efi-amd64, grub-efi-amd64-bin, grub-pc, grub-pc-bin since they are not used, but keep /etc/default/grub with Gandi customisations:
cp -a /etc/default/grub /root/grub
apt-get purge -y grub-efi-amd64 grub-efi-amd64-bin grub-pc grub-pc-bin
mv /root/grub /etc/default/grub
apt-mark manual grub-common grub2-common
update-grub # to check it still work and you should reboot now to be sure it reboots correctly
== Troubleshootings ==
* During a conversion, the root filesystem was mounted read-only in btrfs; it was probably because I didn’t change the options "rw,noatime,errors=remount-ro" to "defaults"
== External links ==
* [https://wiki.xen.org/wiki/PvGrub2 PvGrub2 on Xen wiki]
9eb6739d701f193d52ace0eeee3f854b27cecaa0
658147
658146
2023-06-14T09:10:42Z
Seb35
1
wikitext
text/x-wiki
I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others. For an introduction, see [https://en.wikipedia.org/wiki/Btrfs Wikipedia article] and/or [https://btrfs.wiki.kernel.org the dedicated wiki].
WARNING: this is EXPERIMENTAL and could cause DATA LOSS.
This was updated on 2020-09-24 for Debian 10 buster + GandiV5, and on 2022-02-02 for Debian 11 bullseye + GandiV5. An [{{fullurl:Btrfs|oldid=658077}} older version] was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4.
== Create the server ==
On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 Mio RAM, 1 system disk, Debian 10 buster or Debian 11 bullseye.
For Debian 10 buster (only), define backports (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11):
echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list
Install btrfs-progs:
apt update && apt install -t buster-backports btrfs-progs # Debian 10 buster
apt update && apt install btrfs-progs # Debian 11 bullseye
On GandiV5 :
# stop the server,
# open the page about the system disk in Volumes,
# clone the system disk with another (definitive) name,
# start the server,
# wait until the server is started,
# attach this cloned disk to the server.
ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server).
== Convert to btrfs ==
:''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]''
Display the active root filesystem, and you will be able to deduce what is the cloned filesystem:
ls /dev/xvd*
mount|grep xvd
blkid
Copy the result of <code>blkid</code> in some text file on your computer (will be used later).
Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert])
fsck.ext4 -f /dev/xvdb1 # optional
btrfs-convert -p /dev/xvdb1
Here, I obtained the following error:
root@test:~# btrfs-convert -p /dev/xvdb1
create btrfs filesystem:
blocksize: 4096
nodesize: 16384
features: extref, skinny-metadata (default)
creating ext2 image file
creating btrfs metadata
Unable to find block group for 0 27081]
Unable to find block group for 0
Unable to find block group for 0
ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1
btrfs-convert(+0x11b5a)[0x559c159c1b5a]
btrfs-convert(+0x1589b)[0x559c159c589b]
btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401]
btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c]
btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4]
btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92]
btrfs-convert(+0x10349)[0x559c159c0349]
btrfs-convert(+0x1135f)[0x559c159c135f]
btrfs-convert(main+0x1f59)[0x559c159bdefb]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97]
btrfs-convert(_start+0x2a)[0x559c159bb5ca]
Aborted
According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files)
btrfs-convert -d -p /dev/xvdb1
or even:
btrfs-convert -n -d -p /dev/xvdb1
Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)).
Then, mount the filesystem and delete the old ext4 snapshot:
mount /dev/xvdb1 /mnt
btrfs subvolume delete /mnt/ext2_saved
btrfs filesystem defrag -r /mnt # could take dozen of minuts
btrfs balance start /mnt # could take hours
== Promote as root filesystem ==
:''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]''
Enter the chrooted system:
for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done
chroot /mnt
blkid|grep xvdb1
vi /etc/fstab
Edit the root filesystem with: (the UUID is from the command blkid)
UUID=a74f5787-aee1-4981-b7e6-fbd3cb6ac919 / btrfs defaults 0 1
There are 3 things to change on this line: UUID, ext4 → btrfs, and the options now to "defaults".
(in vi, type "dd" to remove a line, "i" to enter in edit mode, Esc to quit edit mode, ":x" to save and quit.)
Update grub:
update-grub
Change the reference of the root device (will be xvda1 when it will be the root device):
sed -i s/xvdb1/xvda1/g /boot/grub/grub.cfg
Quit:
exit
for i in dev/pts dev proc sys; do umount /mnt/$i; done
umount /mnt
exit
== Define the cooked disk as boot disk ==
In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start".
Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)).
df -hT
It should show something like:
/dev/xvda1 btrfs 50G 32G 19G 63% /
Delete the old root disk.
You can delete the packages grub-efi-amd64, grub-efi-amd64-bin, grub-pc, grub-pc-bin since they are not used, but keep /etc/default/grub with Gandi customisations:
cp -a /etc/default/grub /root/grub
apt-get purge -y grub-efi-amd64 grub-efi-amd64-bin grub-pc grub-pc-bin
mv /root/grub /etc/default/grub
apt-mark manual grub-common grub2-common
update-grub # to check it still work and you should reboot now to be sure it reboots correctly
== Troubleshootings ==
* During a conversion, the root filesystem was mounted read-only in btrfs; it was probably because I didn’t change the options "rw,noatime,errors=remount-ro" to "defaults"
== External links ==
* [https://wiki.xen.org/wiki/PvGrub2 PvGrub2 on Xen wiki]
1bd4c2ec36f6eefd01997f70c9174a4364f4d7e5
658148
658147
2023-06-14T21:53:09Z
Seb35
1
/* Promote as root filesystem */ simplify
wikitext
text/x-wiki
I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others. For an introduction, see [https://en.wikipedia.org/wiki/Btrfs Wikipedia article] and/or [https://btrfs.wiki.kernel.org the dedicated wiki].
WARNING: this is EXPERIMENTAL and could cause DATA LOSS.
This was updated on 2020-09-24 for Debian 10 buster + GandiV5, and on 2022-02-02 for Debian 11 bullseye + GandiV5. An [{{fullurl:Btrfs|oldid=658077}} older version] was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4.
== Create the server ==
On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 Mio RAM, 1 system disk, Debian 10 buster or Debian 11 bullseye.
For Debian 10 buster (only), define backports (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11):
echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list
Install btrfs-progs:
apt update && apt install -t buster-backports btrfs-progs # Debian 10 buster
apt update && apt install btrfs-progs # Debian 11 bullseye
On GandiV5 :
# stop the server,
# open the page about the system disk in Volumes,
# clone the system disk with another (definitive) name,
# start the server,
# wait until the server is started,
# attach this cloned disk to the server.
ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server).
== Convert to btrfs ==
:''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]''
Display the active root filesystem, and you will be able to deduce what is the cloned filesystem:
ls /dev/xvd*
mount|grep xvd
blkid
Copy the result of <code>blkid</code> in some text file on your computer (will be used later).
Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert])
fsck.ext4 -f /dev/xvdb1 # optional
btrfs-convert -p /dev/xvdb1
Here, I obtained the following error:
root@test:~# btrfs-convert -p /dev/xvdb1
create btrfs filesystem:
blocksize: 4096
nodesize: 16384
features: extref, skinny-metadata (default)
creating ext2 image file
creating btrfs metadata
Unable to find block group for 0 27081]
Unable to find block group for 0
Unable to find block group for 0
ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1
btrfs-convert(+0x11b5a)[0x559c159c1b5a]
btrfs-convert(+0x1589b)[0x559c159c589b]
btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401]
btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c]
btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4]
btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92]
btrfs-convert(+0x10349)[0x559c159c0349]
btrfs-convert(+0x1135f)[0x559c159c135f]
btrfs-convert(main+0x1f59)[0x559c159bdefb]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97]
btrfs-convert(_start+0x2a)[0x559c159bb5ca]
Aborted
According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files)
btrfs-convert -d -p /dev/xvdb1
or even:
btrfs-convert -n -d -p /dev/xvdb1
Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)).
Then, mount the filesystem and delete the old ext4 snapshot:
mount /dev/xvdb1 /mnt
btrfs subvolume delete /mnt/ext2_saved
btrfs filesystem defrag -r /mnt # could take dozen of minuts
btrfs balance start /mnt # could take hours
== Promote as root filesystem ==
:''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]''
Edit the /etc/fstab of the btrfs system:
uuid=`blkid|grep -P '^/dev/xvdb1: '|grep -o -P ' UUID="[0-9a-f-]+" '|cut -d'"' -f2`
sed -i -E 's/^UUID=[0-9a-f-]+ *\/ .*$/UUID=$uid \/ btrfs defaults 0 1/' /mnt/etc/fstab
Update Grub in a chrooted system:
for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done
chroot /mnt update-grub
for i in dev/pts dev proc sys; do umount /mnt/$i; done
umount /mnt
Quit:
exit
== Define the cooked disk as boot disk ==
In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start".
Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)).
df -hT
It should show something like:
/dev/xvda1 btrfs 50G 32G 19G 63% /
Delete the old root disk.
You can delete the packages grub-efi-amd64, grub-efi-amd64-bin, grub-pc, grub-pc-bin since they are not used, but keep /etc/default/grub with Gandi customisations:
cp -a /etc/default/grub /root/grub
apt-get purge -y grub-efi-amd64 grub-efi-amd64-bin grub-pc grub-pc-bin
mv /root/grub /etc/default/grub
apt-mark manual grub-common grub2-common
update-grub # to check it still work and you should reboot now to be sure it reboots correctly
== Troubleshootings ==
* During a conversion, the root filesystem was mounted read-only in btrfs; it was probably because I didn’t change the options "rw,noatime,errors=remount-ro" to "defaults"
== External links ==
* [https://wiki.xen.org/wiki/PvGrub2 PvGrub2 on Xen wiki]
4288bc1070d955752362640e535d2f3c0c4fb545
658149
658148
2023-06-15T13:43:29Z
Seb35
1
+Script
wikitext
text/x-wiki
I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others. For an introduction, see [https://en.wikipedia.org/wiki/Btrfs Wikipedia article] and/or [https://btrfs.wiki.kernel.org the dedicated wiki].
WARNING: this is EXPERIMENTAL and could cause DATA LOSS.
This was updated on 2020-09-24 for Debian 10 buster + GandiV5, and on 2022-02-02 for Debian 11 bullseye + GandiV5. An [{{fullurl:Btrfs|oldid=658077}} older version] was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4.
== Create the server ==
On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 Mio RAM, 1 system disk, Debian 10 buster or Debian 11 bullseye.
For Debian 10 buster (only), define backports (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11):
echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list
Install btrfs-progs:
apt update && apt install -t buster-backports btrfs-progs # Debian 10 buster
apt update && apt install btrfs-progs # Debian 11 bullseye
On GandiV5 :
# stop the server,
# open the page about the system disk in Volumes,
# clone the system disk with another (definitive) name,
# start the server,
# wait until the server is started,
# attach this cloned disk to the server.
ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server).
== Convert to btrfs ==
:''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]''
Display the active root filesystem, and you will be able to deduce what is the cloned filesystem:
ls /dev/xvd*
mount|grep xvd
blkid
Copy the result of <code>blkid</code> in some text file on your computer (will be used later).
Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert])
fsck.ext4 -f /dev/xvdb1 # optional
btrfs-convert -p /dev/xvdb1
Here, I obtained the following error:
root@test:~# btrfs-convert -p /dev/xvdb1
create btrfs filesystem:
blocksize: 4096
nodesize: 16384
features: extref, skinny-metadata (default)
creating ext2 image file
creating btrfs metadata
Unable to find block group for 0 27081]
Unable to find block group for 0
Unable to find block group for 0
ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1
btrfs-convert(+0x11b5a)[0x559c159c1b5a]
btrfs-convert(+0x1589b)[0x559c159c589b]
btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401]
btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c]
btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4]
btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92]
btrfs-convert(+0x10349)[0x559c159c0349]
btrfs-convert(+0x1135f)[0x559c159c135f]
btrfs-convert(main+0x1f59)[0x559c159bdefb]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97]
btrfs-convert(_start+0x2a)[0x559c159bb5ca]
Aborted
According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files)
btrfs-convert -d -p /dev/xvdb1
or even:
btrfs-convert -n -d -p /dev/xvdb1
Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)).
Then, mount the filesystem and delete the old ext4 snapshot:
mount /dev/xvdb1 /mnt
btrfs subvolume delete /mnt/ext2_saved
btrfs filesystem defrag -r /mnt # could take dozen of minuts
btrfs balance start /mnt # could take hours
== Promote as root filesystem ==
:''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]''
Edit the /etc/fstab of the btrfs system:
uuid=`blkid|grep -P '^/dev/xvdb1: '|grep -o -P ' UUID="[0-9a-f-]+" '|cut -d'"' -f2`
sed -i -E 's/^UUID=[0-9a-f-]+ *\/ .*$/UUID=$uid \/ btrfs defaults 0 1/' /mnt/etc/fstab
Update Grub in a chrooted system:
for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done
chroot /mnt update-grub
for i in dev/pts dev proc sys; do umount /mnt/$i; done
umount /mnt
Quit:
exit
== Define the cooked disk as boot disk ==
In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start".
Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)).
df -hT
It should show something like:
/dev/xvda1 btrfs 50G 32G 19G 63% /
Delete the old root disk.
You can delete the packages grub-efi-amd64, grub-efi-amd64-bin, grub-pc, grub-pc-bin since they are not used, but keep /etc/default/grub with Gandi customisations:
cp -a /etc/default/grub /root/grub
apt-get purge -y grub-efi-amd64 grub-efi-amd64-bin grub-pc grub-pc-bin
mv /root/grub /etc/default/grub
apt-mark manual grub-common grub2-common
update-grub # to check it still work and you should reboot now to be sure it reboots correctly
== Troubleshootings ==
* During a conversion, the root filesystem was mounted read-only in btrfs; it was probably because I didn’t change the options "rw,noatime,errors=remount-ro" to "defaults"
== Script ==
This script automates the conversion, with a slightly-modified procedure.
On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 Mio RAM, 1 system disk, Debian 11 bullseye.
On GandiV5 :
# stop the server,
# open the page about the system disk in Volumes,
# clone the system disk with another (definitive) name,
# start the server,
# wait until the server is started,
# attach this cloned disk to the server.
ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server).
# Launch this script as root:
<syntaxhighlight lang="shell">
#!/bin/sh
set -e
fs_type=`mount|grep -F ' on / '|grep -o -E ' type [a-z0-9]+ '|cut -d' ' -f3`
blkid=`blkid|grep -F ' LABEL="gandiroot" '`
nb_fs_gandiroot=`echo "$blkid"|cut -d: -f2-|uniq -c|tr -s ' '|cut -d' ' -f2`
if [ "$fs_type" != 'ext4' -o ! "$nb_fs_gandiroot" = 2 ]; then
echo 'It is not possible to convert the disk. There should be two identical devices labeled "gandiroot" formatted in ext4'
exit 2
fi
fs_gandiroot_ext4=`echo "$blkid"|head -n1|cut -d: -f1`
fs_gandiroot_btrfs=`echo "$blkid"|tail -n1|cut -d: -f1`
echo "Current root filesystem: $fs_gandiroot_ext4 (ext4)"
echo "Future root filesystem: $fs_gandiroot_btrfs (currently ext4, will be btrfs)"
set -v
apt-get install -y btrfs-progs
fsck.ext4 -f "$fs_gandiroot_btrfs"
btrfs-convert -p "$fs_gandiroot_btrfs"
mount "$fs_gandiroot_btrfs" /mnt
btrfs subvolume delete /mnt/ext2_saved
btrfs filesystem defrag -r /mnt
btrfs balance start /mnt
for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done
new_uuid=`blkid|grep -P "^$fs_gandiroot_btrfs: "|grep -o -P ' UUID="[0-9a-f-]+" '|cut -d'"' -f2`
sed -i -E "s/^UUID=[0-9a-f-]+ *\/ .*$/UUID=$new_uuid \/ btrfs defaults 0 1/" /mnt/etc/fstab
chroot /mnt update-grub
chroot /mnt apt-get install -y btrfs-progs
for i in dev/pts dev proc sys; do umount /mnt/$i; done
umount /mnt
</syntaxhighlight>
== External links ==
* [https://wiki.xen.org/wiki/PvGrub2 PvGrub2 on Xen wiki]
fdd4c279d74054d19da75661af924e41f11c16af
658150
658149
2023-06-15T13:49:53Z
Seb35
1
/* Script */
wikitext
text/x-wiki
I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others. For an introduction, see [https://en.wikipedia.org/wiki/Btrfs Wikipedia article] and/or [https://btrfs.wiki.kernel.org the dedicated wiki].
WARNING: this is EXPERIMENTAL and could cause DATA LOSS.
This was updated on 2020-09-24 for Debian 10 buster + GandiV5, and on 2022-02-02 for Debian 11 bullseye + GandiV5. An [{{fullurl:Btrfs|oldid=658077}} older version] was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4.
== Create the server ==
On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 Mio RAM, 1 system disk, Debian 10 buster or Debian 11 bullseye.
For Debian 10 buster (only), define backports (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11):
echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list
Install btrfs-progs:
apt update && apt install -t buster-backports btrfs-progs # Debian 10 buster
apt update && apt install btrfs-progs # Debian 11 bullseye
On GandiV5 :
# stop the server,
# open the page about the system disk in Volumes,
# clone the system disk with another (definitive) name,
# start the server,
# wait until the server is started,
# attach this cloned disk to the server.
ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server).
== Convert to btrfs ==
:''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]''
Display the active root filesystem, and you will be able to deduce what is the cloned filesystem:
ls /dev/xvd*
mount|grep xvd
blkid
Copy the result of <code>blkid</code> in some text file on your computer (will be used later).
Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert])
fsck.ext4 -f /dev/xvdb1 # optional
btrfs-convert -p /dev/xvdb1
Here, I obtained the following error:
root@test:~# btrfs-convert -p /dev/xvdb1
create btrfs filesystem:
blocksize: 4096
nodesize: 16384
features: extref, skinny-metadata (default)
creating ext2 image file
creating btrfs metadata
Unable to find block group for 0 27081]
Unable to find block group for 0
Unable to find block group for 0
ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1
btrfs-convert(+0x11b5a)[0x559c159c1b5a]
btrfs-convert(+0x1589b)[0x559c159c589b]
btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401]
btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c]
btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4]
btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92]
btrfs-convert(+0x10349)[0x559c159c0349]
btrfs-convert(+0x1135f)[0x559c159c135f]
btrfs-convert(main+0x1f59)[0x559c159bdefb]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97]
btrfs-convert(_start+0x2a)[0x559c159bb5ca]
Aborted
According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files)
btrfs-convert -d -p /dev/xvdb1
or even:
btrfs-convert -n -d -p /dev/xvdb1
Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)).
Then, mount the filesystem and delete the old ext4 snapshot:
mount /dev/xvdb1 /mnt
btrfs subvolume delete /mnt/ext2_saved
btrfs filesystem defrag -r /mnt # could take dozen of minuts
btrfs balance start /mnt # could take hours
== Promote as root filesystem ==
:''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]''
Edit the /etc/fstab of the btrfs system:
uuid=`blkid|grep -P '^/dev/xvdb1: '|grep -o -P ' UUID="[0-9a-f-]+" '|cut -d'"' -f2`
sed -i -E 's/^UUID=[0-9a-f-]+ *\/ .*$/UUID=$uid \/ btrfs defaults 0 1/' /mnt/etc/fstab
Update Grub in a chrooted system:
for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done
chroot /mnt update-grub
for i in dev/pts dev proc sys; do umount /mnt/$i; done
umount /mnt
Quit:
exit
== Define the cooked disk as boot disk ==
In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start".
Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)).
df -hT
It should show something like:
/dev/xvda1 btrfs 50G 32G 19G 63% /
Delete the old root disk.
You can delete the packages grub-efi-amd64, grub-efi-amd64-bin, grub-pc, grub-pc-bin since they are not used, but keep /etc/default/grub with Gandi customisations:
cp -a /etc/default/grub /root/grub
apt-get purge -y grub-efi-amd64 grub-efi-amd64-bin grub-pc grub-pc-bin
mv /root/grub /etc/default/grub
apt-mark manual grub-common grub2-common
update-grub # to check it still work and you should reboot now to be sure it reboots correctly
== Troubleshootings ==
* During a conversion, the root filesystem was mounted read-only in btrfs; it was probably because I didn’t change the options "rw,noatime,errors=remount-ro" to "defaults"
== Script ==
This script automates the conversion, with a slightly-modified procedure.
On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 Mio RAM, 1 system disk, Debian 11 bullseye.
On GandiV5 :
# stop the server,
# open the page about the system disk in Volumes,
# clone the system disk with another (definitive) name (e.g. the current disk is "sys-myserver", you can define the copied disk as "myserver"),
# start the server,
# wait until the server is started,
# attach this cloned disk to the server.
ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server).
# Launch this script as root: (<code>vi convert_gandiroot_to_btrfs.sh</code> + <code>chmod +x convert_gandiroot_to_btrfs.sh</code> + (<code>./convert_gandiroot_to_btrfs.sh</code>)
<syntaxhighlight lang="shell">
#!/bin/sh
set -e
fs_type=`mount|grep -F ' on / '|grep -o -E ' type [a-z0-9]+ '|cut -d' ' -f3`
blkid=`blkid|grep -F ' LABEL="gandiroot" '`
nb_fs_gandiroot=`echo "$blkid"|cut -d: -f2-|uniq -c|tr -s ' '|cut -d' ' -f2`
if [ "$fs_type" != 'ext4' -o ! "$nb_fs_gandiroot" = 2 ]; then
echo 'It is not possible to convert the disk. There should be two identical devices labeled "gandiroot" formatted in ext4'
exit 2
fi
fs_gandiroot_ext4=`echo "$blkid"|head -n1|cut -d: -f1`
fs_gandiroot_btrfs=`echo "$blkid"|tail -n1|cut -d: -f1`
echo "Current root filesystem: $fs_gandiroot_ext4 (ext4)"
echo "Future root filesystem: $fs_gandiroot_btrfs (currently ext4, will be btrfs)"
set -v
apt-get install -y btrfs-progs
fsck.ext4 -f "$fs_gandiroot_btrfs"
btrfs-convert -p "$fs_gandiroot_btrfs"
mount "$fs_gandiroot_btrfs" /mnt
btrfs subvolume delete /mnt/ext2_saved
btrfs filesystem defrag -r /mnt
btrfs balance start /mnt
for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done
new_uuid=`blkid|grep -P "^$fs_gandiroot_btrfs: "|grep -o -P ' UUID="[0-9a-f-]+" '|cut -d'"' -f2`
sed -i -E "s/^UUID=[0-9a-f-]+ *\/ .*$/UUID=$new_uuid \/ btrfs defaults 0 1/" /mnt/etc/fstab
chroot /mnt update-grub
chroot /mnt apt-get install -y btrfs-progs
for i in dev/pts dev proc sys; do umount /mnt/$i; done
umount /mnt
</syntaxhighlight>
In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start".
Launch the server and execute:
df -hT
It should show something like:
/dev/xvda1 btrfs 5G 3.2G 1.8G 63% /
Delete the old root disk.
== External links ==
* [https://wiki.xen.org/wiki/PvGrub2 PvGrub2 on Xen wiki]
8a2918bebeaf98317a23636574e74b0c8bb50f60
658151
658150
2023-06-15T13:50:16Z
Seb35
1
/* Create the server */
wikitext
text/x-wiki
I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others. For an introduction, see [https://en.wikipedia.org/wiki/Btrfs Wikipedia article] and/or [https://btrfs.wiki.kernel.org the dedicated wiki].
WARNING: this is EXPERIMENTAL and could cause DATA LOSS.
This was updated on 2020-09-24 for Debian 10 buster + GandiV5, and on 2022-02-02 for Debian 11 bullseye + GandiV5. An [{{fullurl:Btrfs|oldid=658077}} older version] was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4.
== Create the server ==
On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 Mio RAM, 1 system disk, Debian 10 buster or Debian 11 bullseye.
For Debian 10 buster (only), define backports (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11):
echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list
Install btrfs-progs:
apt update && apt install -t buster-backports btrfs-progs # Debian 10 buster
apt update && apt install btrfs-progs # Debian 11 bullseye
On GandiV5 :
# stop the server,
# open the page about the system disk in Volumes,
# clone the system disk with another (definitive) name (e.g. the current disk is "sys-myserver", you can define the copied disk as "myserver"),
# start the server,
# wait until the server is started,
# attach this cloned disk to the server.
ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server).
== Convert to btrfs ==
:''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]''
Display the active root filesystem, and you will be able to deduce what is the cloned filesystem:
ls /dev/xvd*
mount|grep xvd
blkid
Copy the result of <code>blkid</code> in some text file on your computer (will be used later).
Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert])
fsck.ext4 -f /dev/xvdb1 # optional
btrfs-convert -p /dev/xvdb1
Here, I obtained the following error:
root@test:~# btrfs-convert -p /dev/xvdb1
create btrfs filesystem:
blocksize: 4096
nodesize: 16384
features: extref, skinny-metadata (default)
creating ext2 image file
creating btrfs metadata
Unable to find block group for 0 27081]
Unable to find block group for 0
Unable to find block group for 0
ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1
btrfs-convert(+0x11b5a)[0x559c159c1b5a]
btrfs-convert(+0x1589b)[0x559c159c589b]
btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401]
btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c]
btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4]
btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92]
btrfs-convert(+0x10349)[0x559c159c0349]
btrfs-convert(+0x1135f)[0x559c159c135f]
btrfs-convert(main+0x1f59)[0x559c159bdefb]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97]
btrfs-convert(_start+0x2a)[0x559c159bb5ca]
Aborted
According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files)
btrfs-convert -d -p /dev/xvdb1
or even:
btrfs-convert -n -d -p /dev/xvdb1
Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)).
Then, mount the filesystem and delete the old ext4 snapshot:
mount /dev/xvdb1 /mnt
btrfs subvolume delete /mnt/ext2_saved
btrfs filesystem defrag -r /mnt # could take dozen of minuts
btrfs balance start /mnt # could take hours
== Promote as root filesystem ==
:''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]''
Edit the /etc/fstab of the btrfs system:
uuid=`blkid|grep -P '^/dev/xvdb1: '|grep -o -P ' UUID="[0-9a-f-]+" '|cut -d'"' -f2`
sed -i -E 's/^UUID=[0-9a-f-]+ *\/ .*$/UUID=$uid \/ btrfs defaults 0 1/' /mnt/etc/fstab
Update Grub in a chrooted system:
for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done
chroot /mnt update-grub
for i in dev/pts dev proc sys; do umount /mnt/$i; done
umount /mnt
Quit:
exit
== Define the cooked disk as boot disk ==
In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start".
Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)).
df -hT
It should show something like:
/dev/xvda1 btrfs 50G 32G 19G 63% /
Delete the old root disk.
You can delete the packages grub-efi-amd64, grub-efi-amd64-bin, grub-pc, grub-pc-bin since they are not used, but keep /etc/default/grub with Gandi customisations:
cp -a /etc/default/grub /root/grub
apt-get purge -y grub-efi-amd64 grub-efi-amd64-bin grub-pc grub-pc-bin
mv /root/grub /etc/default/grub
apt-mark manual grub-common grub2-common
update-grub # to check it still work and you should reboot now to be sure it reboots correctly
== Troubleshootings ==
* During a conversion, the root filesystem was mounted read-only in btrfs; it was probably because I didn’t change the options "rw,noatime,errors=remount-ro" to "defaults"
== Script ==
This script automates the conversion, with a slightly-modified procedure.
On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 Mio RAM, 1 system disk, Debian 11 bullseye.
On GandiV5 :
# stop the server,
# open the page about the system disk in Volumes,
# clone the system disk with another (definitive) name (e.g. the current disk is "sys-myserver", you can define the copied disk as "myserver"),
# start the server,
# wait until the server is started,
# attach this cloned disk to the server.
ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server).
# Launch this script as root: (<code>vi convert_gandiroot_to_btrfs.sh</code> + <code>chmod +x convert_gandiroot_to_btrfs.sh</code> + (<code>./convert_gandiroot_to_btrfs.sh</code>)
<syntaxhighlight lang="shell">
#!/bin/sh
set -e
fs_type=`mount|grep -F ' on / '|grep -o -E ' type [a-z0-9]+ '|cut -d' ' -f3`
blkid=`blkid|grep -F ' LABEL="gandiroot" '`
nb_fs_gandiroot=`echo "$blkid"|cut -d: -f2-|uniq -c|tr -s ' '|cut -d' ' -f2`
if [ "$fs_type" != 'ext4' -o ! "$nb_fs_gandiroot" = 2 ]; then
echo 'It is not possible to convert the disk. There should be two identical devices labeled "gandiroot" formatted in ext4'
exit 2
fi
fs_gandiroot_ext4=`echo "$blkid"|head -n1|cut -d: -f1`
fs_gandiroot_btrfs=`echo "$blkid"|tail -n1|cut -d: -f1`
echo "Current root filesystem: $fs_gandiroot_ext4 (ext4)"
echo "Future root filesystem: $fs_gandiroot_btrfs (currently ext4, will be btrfs)"
set -v
apt-get install -y btrfs-progs
fsck.ext4 -f "$fs_gandiroot_btrfs"
btrfs-convert -p "$fs_gandiroot_btrfs"
mount "$fs_gandiroot_btrfs" /mnt
btrfs subvolume delete /mnt/ext2_saved
btrfs filesystem defrag -r /mnt
btrfs balance start /mnt
for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done
new_uuid=`blkid|grep -P "^$fs_gandiroot_btrfs: "|grep -o -P ' UUID="[0-9a-f-]+" '|cut -d'"' -f2`
sed -i -E "s/^UUID=[0-9a-f-]+ *\/ .*$/UUID=$new_uuid \/ btrfs defaults 0 1/" /mnt/etc/fstab
chroot /mnt update-grub
chroot /mnt apt-get install -y btrfs-progs
for i in dev/pts dev proc sys; do umount /mnt/$i; done
umount /mnt
</syntaxhighlight>
In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start".
Launch the server and execute:
df -hT
It should show something like:
/dev/xvda1 btrfs 5G 3.2G 1.8G 63% /
Delete the old root disk.
== External links ==
* [https://wiki.xen.org/wiki/PvGrub2 PvGrub2 on Xen wiki]
6bfc42f85d7da6247f05ce619bea84d8c1922472
658152
658151
2023-06-15T13:51:12Z
Seb35
1
wikitext
text/x-wiki
I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others. For an introduction, see [https://en.wikipedia.org/wiki/Btrfs Wikipedia article] and/or [https://btrfs.wiki.kernel.org the dedicated wiki].
WARNING: this is EXPERIMENTAL and could cause DATA LOSS.
This was updated on 2020-09-24 for Debian 10 buster + GandiV5, and on 2022-02-02 for Debian 11 bullseye + GandiV5. An [{{fullurl:Btrfs|oldid=658077}} older version] was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4.
== Create the server ==
On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 MiB RAM, 1 system disk of 5 GiB, Debian 10 buster or Debian 11 bullseye.
For Debian 10 buster (only), define backports (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11):
echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list
Install btrfs-progs:
apt update && apt install -t buster-backports btrfs-progs # Debian 10 buster
apt update && apt install btrfs-progs # Debian 11 bullseye
On GandiV5 :
# stop the server,
# open the page about the system disk in Volumes,
# clone the system disk with another (definitive) name (e.g. the current disk is "sys-myserver", you can define the copied disk as "myserver"),
# start the server,
# wait until the server is started,
# attach this cloned disk to the server.
ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server).
== Convert to btrfs ==
:''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]''
Display the active root filesystem, and you will be able to deduce what is the cloned filesystem:
ls /dev/xvd*
mount|grep xvd
blkid
Copy the result of <code>blkid</code> in some text file on your computer (will be used later).
Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert])
fsck.ext4 -f /dev/xvdb1 # optional
btrfs-convert -p /dev/xvdb1
Here, I obtained the following error:
root@test:~# btrfs-convert -p /dev/xvdb1
create btrfs filesystem:
blocksize: 4096
nodesize: 16384
features: extref, skinny-metadata (default)
creating ext2 image file
creating btrfs metadata
Unable to find block group for 0 27081]
Unable to find block group for 0
Unable to find block group for 0
ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1
btrfs-convert(+0x11b5a)[0x559c159c1b5a]
btrfs-convert(+0x1589b)[0x559c159c589b]
btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401]
btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c]
btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4]
btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92]
btrfs-convert(+0x10349)[0x559c159c0349]
btrfs-convert(+0x1135f)[0x559c159c135f]
btrfs-convert(main+0x1f59)[0x559c159bdefb]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97]
btrfs-convert(_start+0x2a)[0x559c159bb5ca]
Aborted
According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files)
btrfs-convert -d -p /dev/xvdb1
or even:
btrfs-convert -n -d -p /dev/xvdb1
Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)).
Then, mount the filesystem and delete the old ext4 snapshot:
mount /dev/xvdb1 /mnt
btrfs subvolume delete /mnt/ext2_saved
btrfs filesystem defrag -r /mnt # could take dozen of minuts
btrfs balance start /mnt # could take hours
== Promote as root filesystem ==
:''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]''
Edit the /etc/fstab of the btrfs system:
uuid=`blkid|grep -P '^/dev/xvdb1: '|grep -o -P ' UUID="[0-9a-f-]+" '|cut -d'"' -f2`
sed -i -E 's/^UUID=[0-9a-f-]+ *\/ .*$/UUID=$uid \/ btrfs defaults 0 1/' /mnt/etc/fstab
Update Grub in a chrooted system:
for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done
chroot /mnt update-grub
for i in dev/pts dev proc sys; do umount /mnt/$i; done
umount /mnt
Quit:
exit
== Define the cooked disk as boot disk ==
In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start".
Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)).
df -hT
It should show something like:
/dev/xvda1 btrfs 50G 32G 19G 63% /
Delete the old root disk.
You can delete the packages grub-efi-amd64, grub-efi-amd64-bin, grub-pc, grub-pc-bin since they are not used, but keep /etc/default/grub with Gandi customisations:
cp -a /etc/default/grub /root/grub
apt-get purge -y grub-efi-amd64 grub-efi-amd64-bin grub-pc grub-pc-bin
mv /root/grub /etc/default/grub
apt-mark manual grub-common grub2-common
update-grub # to check it still work and you should reboot now to be sure it reboots correctly
== Troubleshootings ==
* During a conversion, the root filesystem was mounted read-only in btrfs; it was probably because I didn’t change the options "rw,noatime,errors=remount-ro" to "defaults"
== Script ==
This script automates the conversion, with a slightly-modified procedure.
On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 MiB RAM, 1 system disk of 5 GiB, Debian 11 bullseye.
On GandiV5 :
# stop the server,
# open the page about the system disk in Volumes,
# clone the system disk with another (definitive) name (e.g. the current disk is "sys-myserver", you can define the copied disk as "myserver"),
# start the server,
# wait until the server is started,
# attach this cloned disk to the server.
ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server).
# Launch this script as root: (<code>vi convert_gandiroot_to_btrfs.sh</code> + <code>chmod +x convert_gandiroot_to_btrfs.sh</code> + (<code>./convert_gandiroot_to_btrfs.sh</code>)
<syntaxhighlight lang="shell">
#!/bin/sh
set -e
fs_type=`mount|grep -F ' on / '|grep -o -E ' type [a-z0-9]+ '|cut -d' ' -f3`
blkid=`blkid|grep -F ' LABEL="gandiroot" '`
nb_fs_gandiroot=`echo "$blkid"|cut -d: -f2-|uniq -c|tr -s ' '|cut -d' ' -f2`
if [ "$fs_type" != 'ext4' -o ! "$nb_fs_gandiroot" = 2 ]; then
echo 'It is not possible to convert the disk. There should be two identical devices labeled "gandiroot" formatted in ext4'
exit 2
fi
fs_gandiroot_ext4=`echo "$blkid"|head -n1|cut -d: -f1`
fs_gandiroot_btrfs=`echo "$blkid"|tail -n1|cut -d: -f1`
echo "Current root filesystem: $fs_gandiroot_ext4 (ext4)"
echo "Future root filesystem: $fs_gandiroot_btrfs (currently ext4, will be btrfs)"
set -v
apt-get install -y btrfs-progs
fsck.ext4 -f "$fs_gandiroot_btrfs"
btrfs-convert -p "$fs_gandiroot_btrfs"
mount "$fs_gandiroot_btrfs" /mnt
btrfs subvolume delete /mnt/ext2_saved
btrfs filesystem defrag -r /mnt
btrfs balance start /mnt
for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done
new_uuid=`blkid|grep -P "^$fs_gandiroot_btrfs: "|grep -o -P ' UUID="[0-9a-f-]+" '|cut -d'"' -f2`
sed -i -E "s/^UUID=[0-9a-f-]+ *\/ .*$/UUID=$new_uuid \/ btrfs defaults 0 1/" /mnt/etc/fstab
chroot /mnt update-grub
chroot /mnt apt-get install -y btrfs-progs
for i in dev/pts dev proc sys; do umount /mnt/$i; done
umount /mnt
</syntaxhighlight>
In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start".
Launch the server and execute:
df -hT
It should show something like:
/dev/xvda1 btrfs 5G 3.2G 1.8G 63% /
Delete the old root disk.
== External links ==
* [https://wiki.xen.org/wiki/PvGrub2 PvGrub2 on Xen wiki]
1411e41423446b545abbb36d7ef862888c8632df
658153
658152
2023-06-15T13:53:26Z
Seb35
1
wikitext
text/x-wiki
I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others. For an introduction, see [https://en.wikipedia.org/wiki/Btrfs Wikipedia article] and/or [https://btrfs.wiki.kernel.org the dedicated wiki].
WARNING: this could cause DATA LOSS, be sure you have backups (possibly Gandi snapshots).
This was updated on 2020-09-24 for Debian 10 buster + GandiV5, and on 2022-02-02 for Debian 11 bullseye + GandiV5. An [{{fullurl:Btrfs|oldid=658077}} older version] was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4.
== Create the server ==
On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 MiB RAM, 1 system disk of 5 GiB, Debian 10 buster or Debian 11 bullseye.
For Debian 10 buster (only), define backports (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11):
echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list
Install btrfs-progs:
apt update && apt install -t buster-backports btrfs-progs # Debian 10 buster
apt update && apt install btrfs-progs # Debian 11 bullseye
On GandiV5 :
# stop the server,
# open the page about the system disk in Volumes,
# clone the system disk with another (definitive) name (e.g. the current disk is "sys-myserver", you can define the copied disk as "myserver"),
# start the server,
# wait until the server is started,
# attach this cloned disk to the server.
ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server).
== Convert to btrfs ==
:''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]''
Display the active root filesystem, and you will be able to deduce what is the cloned filesystem:
ls /dev/xvd*
mount|grep xvd
blkid
Copy the result of <code>blkid</code> in some text file on your computer (will be used later).
Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert])
fsck.ext4 -f /dev/xvdb1 # optional
btrfs-convert -p /dev/xvdb1
Here, I obtained the following error:
root@test:~# btrfs-convert -p /dev/xvdb1
create btrfs filesystem:
blocksize: 4096
nodesize: 16384
features: extref, skinny-metadata (default)
creating ext2 image file
creating btrfs metadata
Unable to find block group for 0 27081]
Unable to find block group for 0
Unable to find block group for 0
ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1
btrfs-convert(+0x11b5a)[0x559c159c1b5a]
btrfs-convert(+0x1589b)[0x559c159c589b]
btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401]
btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c]
btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4]
btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92]
btrfs-convert(+0x10349)[0x559c159c0349]
btrfs-convert(+0x1135f)[0x559c159c135f]
btrfs-convert(main+0x1f59)[0x559c159bdefb]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97]
btrfs-convert(_start+0x2a)[0x559c159bb5ca]
Aborted
According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files)
btrfs-convert -d -p /dev/xvdb1
or even:
btrfs-convert -n -d -p /dev/xvdb1
Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)).
Then, mount the filesystem and delete the old ext4 snapshot:
mount /dev/xvdb1 /mnt
btrfs subvolume delete /mnt/ext2_saved
btrfs filesystem defrag -r /mnt # could take dozen of minuts
btrfs balance start /mnt # could take hours
== Promote as root filesystem ==
:''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]''
Edit the /etc/fstab of the btrfs system:
uuid=`blkid|grep -P '^/dev/xvdb1: '|grep -o -P ' UUID="[0-9a-f-]+" '|cut -d'"' -f2`
sed -i -E 's/^UUID=[0-9a-f-]+ *\/ .*$/UUID=$uid \/ btrfs defaults 0 1/' /mnt/etc/fstab
Update Grub in a chrooted system:
for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done
chroot /mnt update-grub
for i in dev/pts dev proc sys; do umount /mnt/$i; done
umount /mnt
Quit:
exit
== Define the cooked disk as boot disk ==
In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start".
Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)).
df -hT
It should show something like:
/dev/xvda1 btrfs 50G 32G 19G 63% /
Delete the old root disk.
You can delete the packages grub-efi-amd64, grub-efi-amd64-bin, grub-pc, grub-pc-bin since they are not used, but keep /etc/default/grub with Gandi customisations:
cp -a /etc/default/grub /root/grub
apt-get purge -y grub-efi-amd64 grub-efi-amd64-bin grub-pc grub-pc-bin
mv /root/grub /etc/default/grub
apt-mark manual grub-common grub2-common
update-grub # to check it still work and you should reboot now to be sure it reboots correctly
== Troubleshootings ==
* During a conversion, the root filesystem was mounted read-only in btrfs; it was probably because I didn’t change the options "rw,noatime,errors=remount-ro" to "defaults"
== Script ==
This script automates the conversion, with a slightly-modified procedure.
On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 MiB RAM, 1 system disk of 5 GiB, Debian 11 bullseye.
On GandiV5 :
# stop the server,
# open the page about the system disk in Volumes,
# clone the system disk with another (definitive) name (e.g. the current disk is "sys-myserver", you can define the copied disk as "myserver"),
# start the server,
# wait until the server is started,
# attach this cloned disk to the server.
ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server).
# Launch this script as root: (<code>vi convert_gandiroot_to_btrfs.sh</code> + <code>chmod +x convert_gandiroot_to_btrfs.sh</code> + (<code>./convert_gandiroot_to_btrfs.sh</code>)
<syntaxhighlight lang="shell">
#!/bin/sh
set -e
fs_type=`mount|grep -F ' on / '|grep -o -E ' type [a-z0-9]+ '|cut -d' ' -f3`
blkid=`blkid|grep -F ' LABEL="gandiroot" '`
nb_fs_gandiroot=`echo "$blkid"|cut -d: -f2-|uniq -c|tr -s ' '|cut -d' ' -f2`
if [ "$fs_type" != 'ext4' -o ! "$nb_fs_gandiroot" = 2 ]; then
echo 'It is not possible to convert the disk. There should be two identical devices labeled "gandiroot" formatted in ext4'
exit 2
fi
fs_gandiroot_ext4=`echo "$blkid"|head -n1|cut -d: -f1`
fs_gandiroot_btrfs=`echo "$blkid"|tail -n1|cut -d: -f1`
echo "Current root filesystem: $fs_gandiroot_ext4 (ext4)"
echo "Future root filesystem: $fs_gandiroot_btrfs (currently ext4, will be btrfs)"
set -v
apt-get install -y btrfs-progs
fsck.ext4 -f "$fs_gandiroot_btrfs"
btrfs-convert -p "$fs_gandiroot_btrfs"
mount "$fs_gandiroot_btrfs" /mnt
btrfs subvolume delete /mnt/ext2_saved
btrfs filesystem defrag -r /mnt
btrfs balance start /mnt
for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done
new_uuid=`blkid|grep -P "^$fs_gandiroot_btrfs: "|grep -o -P ' UUID="[0-9a-f-]+" '|cut -d'"' -f2`
sed -i -E "s/^UUID=[0-9a-f-]+ *\/ .*$/UUID=$new_uuid \/ btrfs defaults 0 1/" /mnt/etc/fstab
chroot /mnt update-grub
for i in dev/pts dev proc sys; do umount /mnt/$i; done
umount /mnt
</syntaxhighlight>
In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start".
Launch the server and execute:
df -hT
It should show something like:
/dev/xvda1 btrfs 5G 3.2G 1.8G 63% /
Delete the old root disk.
== External links ==
* [https://wiki.xen.org/wiki/PvGrub2 PvGrub2 on Xen wiki]
368f93a6e35cb81315185417b7b61ce7e8b0ba13
658154
658153
2023-06-15T13:55:32Z
Seb35
1
Add a chapter section "Manual procedure"
wikitext
text/x-wiki
I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others. For an introduction, see [https://en.wikipedia.org/wiki/Btrfs Wikipedia article] and/or [https://btrfs.wiki.kernel.org the dedicated wiki].
WARNING: this could cause DATA LOSS, be sure you have backups (possibly Gandi snapshots).
This was updated on 2020-09-24 for Debian 10 buster + GandiV5, and on 2022-02-02 for Debian 11 bullseye + GandiV5. An [{{fullurl:Btrfs|oldid=658077}} older version] was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4.
== Manual procedure ==
=== Create the server ===
On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 MiB RAM, 1 system disk of 5 GiB, Debian 10 buster or Debian 11 bullseye.
For Debian 10 buster (only), define backports (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11):
echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list
Install btrfs-progs:
apt update && apt install -t buster-backports btrfs-progs # Debian 10 buster
apt update && apt install btrfs-progs # Debian 11 bullseye
On GandiV5 :
# stop the server,
# open the page about the system disk in Volumes,
# clone the system disk with another (definitive) name (e.g. the current disk is "sys-myserver", you can define the copied disk as "myserver"),
# start the server,
# wait until the server is started,
# attach this cloned disk to the server.
ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server).
=== Convert to btrfs ===
:''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]''
Display the active root filesystem, and you will be able to deduce what is the cloned filesystem:
ls /dev/xvd*
mount|grep xvd
blkid
Copy the result of <code>blkid</code> in some text file on your computer (will be used later).
Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert])
fsck.ext4 -f /dev/xvdb1 # optional
btrfs-convert -p /dev/xvdb1
Here, I obtained the following error:
root@test:~# btrfs-convert -p /dev/xvdb1
create btrfs filesystem:
blocksize: 4096
nodesize: 16384
features: extref, skinny-metadata (default)
creating ext2 image file
creating btrfs metadata
Unable to find block group for 0 27081]
Unable to find block group for 0
Unable to find block group for 0
ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1
btrfs-convert(+0x11b5a)[0x559c159c1b5a]
btrfs-convert(+0x1589b)[0x559c159c589b]
btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401]
btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c]
btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4]
btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92]
btrfs-convert(+0x10349)[0x559c159c0349]
btrfs-convert(+0x1135f)[0x559c159c135f]
btrfs-convert(main+0x1f59)[0x559c159bdefb]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97]
btrfs-convert(_start+0x2a)[0x559c159bb5ca]
Aborted
According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files)
btrfs-convert -d -p /dev/xvdb1
or even:
btrfs-convert -n -d -p /dev/xvdb1
Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)).
Then, mount the filesystem and delete the old ext4 snapshot:
mount /dev/xvdb1 /mnt
btrfs subvolume delete /mnt/ext2_saved
btrfs filesystem defrag -r /mnt # could take dozen of minuts
btrfs balance start /mnt # could take hours
=== Promote as root filesystem ===
:''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]''
Edit the /etc/fstab of the btrfs system:
uuid=`blkid|grep -P '^/dev/xvdb1: '|grep -o -P ' UUID="[0-9a-f-]+" '|cut -d'"' -f2`
sed -i -E 's/^UUID=[0-9a-f-]+ *\/ .*$/UUID=$uid \/ btrfs defaults 0 1/' /mnt/etc/fstab
Update Grub in a chrooted system:
for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done
chroot /mnt update-grub
for i in dev/pts dev proc sys; do umount /mnt/$i; done
umount /mnt
Quit:
exit
=== Define the cooked disk as boot disk ===
In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start".
Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)).
df -hT
It should show something like:
/dev/xvda1 btrfs 50G 32G 19G 63% /
Delete the old root disk.
You can delete the packages grub-efi-amd64, grub-efi-amd64-bin, grub-pc, grub-pc-bin since they are not used, but keep /etc/default/grub with Gandi customisations:
cp -a /etc/default/grub /root/grub
apt-get purge -y grub-efi-amd64 grub-efi-amd64-bin grub-pc grub-pc-bin
mv /root/grub /etc/default/grub
apt-mark manual grub-common grub2-common
update-grub # to check it still work and you should reboot now to be sure it reboots correctly
== Scripted procedure ==
This script automates the conversion, with a slightly-modified procedure.
On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 MiB RAM, 1 system disk of 5 GiB, Debian 11 bullseye.
On GandiV5 :
# stop the server,
# open the page about the system disk in Volumes,
# clone the system disk with another (definitive) name (e.g. the current disk is "sys-myserver", you can define the copied disk as "myserver"),
# start the server,
# wait until the server is started,
# attach this cloned disk to the server.
ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server).
# Launch this script as root: (<code>vi convert_gandiroot_to_btrfs.sh</code> + <code>chmod +x convert_gandiroot_to_btrfs.sh</code> + (<code>./convert_gandiroot_to_btrfs.sh</code>)
<syntaxhighlight lang="shell">
#!/bin/sh
set -e
fs_type=`mount|grep -F ' on / '|grep -o -E ' type [a-z0-9]+ '|cut -d' ' -f3`
blkid=`blkid|grep -F ' LABEL="gandiroot" '`
nb_fs_gandiroot=`echo "$blkid"|cut -d: -f2-|uniq -c|tr -s ' '|cut -d' ' -f2`
if [ "$fs_type" != 'ext4' -o ! "$nb_fs_gandiroot" = 2 ]; then
echo 'It is not possible to convert the disk. There should be two identical devices labeled "gandiroot" formatted in ext4'
exit 2
fi
fs_gandiroot_ext4=`echo "$blkid"|head -n1|cut -d: -f1`
fs_gandiroot_btrfs=`echo "$blkid"|tail -n1|cut -d: -f1`
echo "Current root filesystem: $fs_gandiroot_ext4 (ext4)"
echo "Future root filesystem: $fs_gandiroot_btrfs (currently ext4, will be btrfs)"
set -v
apt-get install -y btrfs-progs
fsck.ext4 -f "$fs_gandiroot_btrfs"
btrfs-convert -p "$fs_gandiroot_btrfs"
mount "$fs_gandiroot_btrfs" /mnt
btrfs subvolume delete /mnt/ext2_saved
btrfs filesystem defrag -r /mnt
btrfs balance start /mnt
for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done
new_uuid=`blkid|grep -P "^$fs_gandiroot_btrfs: "|grep -o -P ' UUID="[0-9a-f-]+" '|cut -d'"' -f2`
sed -i -E "s/^UUID=[0-9a-f-]+ *\/ .*$/UUID=$new_uuid \/ btrfs defaults 0 1/" /mnt/etc/fstab
chroot /mnt update-grub
for i in dev/pts dev proc sys; do umount /mnt/$i; done
umount /mnt
</syntaxhighlight>
In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start".
Launch the server and execute:
df -hT
It should show something like:
/dev/xvda1 btrfs 5G 3.2G 1.8G 63% /
Delete the old root disk.
== Troubleshootings ==
* During a conversion, the root filesystem was mounted read-only in btrfs; it was probably because I didn’t change the options "rw,noatime,errors=remount-ro" to "defaults"
== External links ==
* [https://wiki.xen.org/wiki/PvGrub2 PvGrub2 on Xen wiki]
57ff105f2848b80f1ef7d7e12edcd468b08298c1
658155
658154
2023-06-15T13:59:53Z
Seb35
1
/* Scripted procedure */
wikitext
text/x-wiki
I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others. For an introduction, see [https://en.wikipedia.org/wiki/Btrfs Wikipedia article] and/or [https://btrfs.wiki.kernel.org the dedicated wiki].
WARNING: this could cause DATA LOSS, be sure you have backups (possibly Gandi snapshots).
This was updated on 2020-09-24 for Debian 10 buster + GandiV5, and on 2022-02-02 for Debian 11 bullseye + GandiV5. An [{{fullurl:Btrfs|oldid=658077}} older version] was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4.
== Manual procedure ==
=== Create the server ===
On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 MiB RAM, 1 system disk of 5 GiB, Debian 10 buster or Debian 11 bullseye.
For Debian 10 buster (only), define backports (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11):
echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list
Install btrfs-progs:
apt update && apt install -t buster-backports btrfs-progs # Debian 10 buster
apt update && apt install btrfs-progs # Debian 11 bullseye
On GandiV5 :
# stop the server,
# open the page about the system disk in Volumes,
# clone the system disk with another (definitive) name (e.g. the current disk is "sys-myserver", you can define the copied disk as "myserver"),
# start the server,
# wait until the server is started,
# attach this cloned disk to the server.
ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server).
=== Convert to btrfs ===
:''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]''
Display the active root filesystem, and you will be able to deduce what is the cloned filesystem:
ls /dev/xvd*
mount|grep xvd
blkid
Copy the result of <code>blkid</code> in some text file on your computer (will be used later).
Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert])
fsck.ext4 -f /dev/xvdb1 # optional
btrfs-convert -p /dev/xvdb1
Here, I obtained the following error:
root@test:~# btrfs-convert -p /dev/xvdb1
create btrfs filesystem:
blocksize: 4096
nodesize: 16384
features: extref, skinny-metadata (default)
creating ext2 image file
creating btrfs metadata
Unable to find block group for 0 27081]
Unable to find block group for 0
Unable to find block group for 0
ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1
btrfs-convert(+0x11b5a)[0x559c159c1b5a]
btrfs-convert(+0x1589b)[0x559c159c589b]
btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401]
btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c]
btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4]
btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92]
btrfs-convert(+0x10349)[0x559c159c0349]
btrfs-convert(+0x1135f)[0x559c159c135f]
btrfs-convert(main+0x1f59)[0x559c159bdefb]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97]
btrfs-convert(_start+0x2a)[0x559c159bb5ca]
Aborted
According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files)
btrfs-convert -d -p /dev/xvdb1
or even:
btrfs-convert -n -d -p /dev/xvdb1
Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)).
Then, mount the filesystem and delete the old ext4 snapshot:
mount /dev/xvdb1 /mnt
btrfs subvolume delete /mnt/ext2_saved
btrfs filesystem defrag -r /mnt # could take dozen of minuts
btrfs balance start /mnt # could take hours
=== Promote as root filesystem ===
:''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]''
Edit the /etc/fstab of the btrfs system:
uuid=`blkid|grep -P '^/dev/xvdb1: '|grep -o -P ' UUID="[0-9a-f-]+" '|cut -d'"' -f2`
sed -i -E 's/^UUID=[0-9a-f-]+ *\/ .*$/UUID=$uid \/ btrfs defaults 0 1/' /mnt/etc/fstab
Update Grub in a chrooted system:
for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done
chroot /mnt update-grub
for i in dev/pts dev proc sys; do umount /mnt/$i; done
umount /mnt
Quit:
exit
=== Define the cooked disk as boot disk ===
In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start".
Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)).
df -hT
It should show something like:
/dev/xvda1 btrfs 50G 32G 19G 63% /
Delete the old root disk.
You can delete the packages grub-efi-amd64, grub-efi-amd64-bin, grub-pc, grub-pc-bin since they are not used, but keep /etc/default/grub with Gandi customisations:
cp -a /etc/default/grub /root/grub
apt-get purge -y grub-efi-amd64 grub-efi-amd64-bin grub-pc grub-pc-bin
mv /root/grub /etc/default/grub
apt-mark manual grub-common grub2-common
update-grub # to check it still work and you should reboot now to be sure it reboots correctly
== Scripted procedure ==
This script automates the conversion, with a slightly-modified procedure.
On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 MiB RAM, 1 system disk of 5 GiB, Debian 11 bullseye.
On GandiV5 :
# stop the server,
# open the page about the system disk in Volumes,
# clone the system disk with another (definitive) name (e.g. the current disk is "sys-myserver", you can define the copied disk as "myserver"),
# start the server,
# wait until the server is started,
# attach this cloned disk to the server.
ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server).
# Launch this script as root: (<code>vi convert_gandiroot_to_btrfs.sh</code> + <code>chmod +x convert_gandiroot_to_btrfs.sh</code> + (<code>./convert_gandiroot_to_btrfs.sh</code>)
<syntaxhighlight lang="shell">
#!/bin/sh
set -e
fs_type=`mount|grep -F ' on / '|grep -o -E ' type [a-z0-9]+ '|cut -d' ' -f3`
blkid=`blkid|grep -F ' LABEL="gandiroot" '`
nb_fs_gandiroot=`echo "$blkid"|cut -d: -f2-|uniq -c|tr -s ' '|cut -d' ' -f2`
if [ "$fs_type" != 'ext4' -o ! "$nb_fs_gandiroot" = 2 ]; then
echo 'It is not possible to convert the disk. There should be two identical devices labeled "gandiroot" formatted in ext4'
exit 2
fi
fs_gandiroot_ext4=`echo "$blkid"|head -n1|cut -d: -f1`
fs_gandiroot_btrfs=`echo "$blkid"|tail -n1|cut -d: -f1`
echo "Current root filesystem: $fs_gandiroot_ext4 (ext4)"
echo "Future root filesystem: $fs_gandiroot_btrfs (currently ext4, will be btrfs)"
set -v
apt-get install -y btrfs-progs
fsck.ext4 -f "$fs_gandiroot_btrfs"
btrfs-convert -p "$fs_gandiroot_btrfs"
mount "$fs_gandiroot_btrfs" /mnt
btrfs subvolume delete /mnt/ext2_saved
btrfs filesystem defrag -r /mnt
btrfs balance start /mnt
new_uuid=`blkid|grep -P "^$fs_gandiroot_btrfs: "|grep -o -P ' UUID="[0-9a-f-]+" '|cut -d'"' -f2`
sed -i -E "s/^UUID=[0-9a-f-]+ *\/ .*$/UUID=$new_uuid \/ btrfs defaults 0 1/" /mnt/etc/fstab
for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done
chroot /mnt update-grub
for i in dev/pts dev proc sys; do umount /mnt/$i; done
umount /mnt
</syntaxhighlight>
In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start".
Launch the server and execute:
df -hT
It should show something like:
/dev/xvda1 btrfs 5G 3.2G 1.8G 63% /
Delete the old root disk.
== Troubleshootings ==
* During a conversion, the root filesystem was mounted read-only in btrfs; it was probably because I didn’t change the options "rw,noatime,errors=remount-ro" to "defaults"
== External links ==
* [https://wiki.xen.org/wiki/PvGrub2 PvGrub2 on Xen wiki]
a7bea4d4e9d7aaac6f1b09081fe18780d049af6b
658156
658155
2023-06-15T15:19:53Z
Seb35
1
Details
wikitext
text/x-wiki
I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others. For an introduction, see [https://en.wikipedia.org/wiki/Btrfs Wikipedia article] and/or [https://btrfs.wiki.kernel.org the dedicated wiki].
WARNING: this could cause DATA LOSS, be sure you have backups (possibly Gandi snapshots).
This was updated on 2020-09-24 for Debian 10 buster + GandiV5, and on 2022-02-02 for Debian 11 bullseye + GandiV5. An [{{fullurl:Btrfs|oldid=658077}} older version] was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4.
== Manual procedure ==
=== Create the server ===
On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 MiB RAM, 1 system disk of 5 GiB, Debian 10 buster or Debian 11 bullseye.
For Debian 10 buster (only), define backports (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11):
echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list
Install btrfs-progs:
apt update && apt install -t buster-backports btrfs-progs # Debian 10 buster
apt update && apt install btrfs-progs # Debian 11 bullseye
On GandiV5 :
# stop the server,
# open the page about the system disk in Volumes,
# clone the system disk with another (definitive) name (e.g. the current disk is "sys-myserver", you can define the copied disk as "myserver"),
# start the server,
# wait until the server is started,
# attach this cloned disk to the server.
ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server).
=== Convert to btrfs ===
:''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]''
Display the active root filesystem, and you will be able to deduce what is the cloned filesystem:
ls /dev/xvd*
mount|grep xvd
blkid
Copy the result of <code>blkid</code> in some text file on your computer (will be used later).
Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert])
fsck.ext4 -f /dev/xvdb1 # optional
btrfs-convert -p /dev/xvdb1
Here, I obtained the following error:
root@test:~# btrfs-convert -p /dev/xvdb1
create btrfs filesystem:
blocksize: 4096
nodesize: 16384
features: extref, skinny-metadata (default)
creating ext2 image file
creating btrfs metadata
Unable to find block group for 0 27081]
Unable to find block group for 0
Unable to find block group for 0
ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1
btrfs-convert(+0x11b5a)[0x559c159c1b5a]
btrfs-convert(+0x1589b)[0x559c159c589b]
btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401]
btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c]
btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4]
btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92]
btrfs-convert(+0x10349)[0x559c159c0349]
btrfs-convert(+0x1135f)[0x559c159c135f]
btrfs-convert(main+0x1f59)[0x559c159bdefb]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97]
btrfs-convert(_start+0x2a)[0x559c159bb5ca]
Aborted
According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files)
btrfs-convert -d -p /dev/xvdb1
or even:
btrfs-convert -n -d -p /dev/xvdb1
Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)).
Then, mount the filesystem and delete the old ext4 snapshot:
mount /dev/xvdb1 /mnt
btrfs subvolume delete /mnt/ext2_saved
btrfs filesystem defrag -r /mnt # could take dozen of minuts
btrfs balance start /mnt # could take hours
=== Promote as root filesystem ===
:''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]''
Edit the /etc/fstab of the btrfs system:
uuid=`blkid|grep -P '^/dev/xvdb1: '|grep -o -P ' UUID="[0-9a-f-]+" '|cut -d'"' -f2`
sed -i -E 's/^UUID=[0-9a-f-]+ *\/ .*$/UUID=$uid \/ btrfs defaults 0 1/' /mnt/etc/fstab
Update Grub in a chrooted system:
for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done
chroot /mnt update-grub
for i in dev/pts dev proc sys; do umount /mnt/$i; done
umount /mnt
Quit:
exit
=== Define the cooked disk as boot disk ===
In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start".
Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)).
df -hT
It should show something like:
/dev/xvda1 btrfs 50G 32G 19G 63% /
Delete the old root disk.
You can delete the packages grub-efi-amd64, grub-efi-amd64-bin, grub-pc, grub-pc-bin since they are not used, but keep /etc/default/grub with Gandi customisations:
cp -a /etc/default/grub /root/grub
apt-get purge -y grub-efi-amd64 grub-efi-amd64-bin grub-pc grub-pc-bin
mv /root/grub /etc/default/grub
apt-mark manual grub-common grub2-common
update-grub # to check it still work and you should reboot now to be sure it reboots correctly
== Scripted procedure ==
This script automates the conversion, with a slightly-modified procedure.
On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 MiB RAM, 1 system disk of 5 GiB, Debian 11 bullseye.
On GandiV5 :
# stop the server,
# open the page about the system disk in Volumes,
# clone the system disk with another (definitive) name (e.g. the current disk is "sys-myserver", you can define the copied disk as "myserver"),
# start the server,
# wait until the server is started,
# attach this cloned disk to the server.
ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server).
# Launch this script as root: (<code>vi convert_gandiroot_to_btrfs.sh</code> + <code>chmod +x convert_gandiroot_to_btrfs.sh</code> + (<code>./convert_gandiroot_to_btrfs.sh</code>)
<syntaxhighlight lang="shell">
#!/bin/sh
set -e
fs_type=`mount|grep -F ' on / '|grep -o -E ' type [a-z0-9]+ '|cut -d' ' -f3`
blkid=`blkid|grep -F ' LABEL="gandiroot" '`
nb_fs_gandiroot=`echo "$blkid"|cut -d: -f2-|uniq -c|tr -s ' '|cut -d' ' -f2`
if [ "$fs_type" != 'ext4' -o ! "$nb_fs_gandiroot" = 2 ]; then
echo 'It is not possible to convert the disk. There should be two identical devices labeled "gandiroot" formatted in ext4'
exit 2
fi
fs_gandiroot_ext4=`echo "$blkid"|head -n1|cut -d: -f1`
fs_gandiroot_btrfs=`echo "$blkid"|tail -n1|cut -d: -f1`
echo
echo "Current root filesystem: $fs_gandiroot_ext4 (ext4)"
echo "Future root filesystem: $fs_gandiroot_btrfs (currently ext4, will be btrfs)"
set -v
apt-get install -y btrfs-progs
fsck.ext4 -f "$fs_gandiroot_btrfs"
btrfs-convert -p "$fs_gandiroot_btrfs"
mount "$fs_gandiroot_btrfs" /mnt
btrfs subvolume delete -C /mnt/ext2_saved
btrfs filesystem defragment -r /mnt
btrfs balance start /mnt
new_uuid=`blkid|grep -P "^$fs_gandiroot_btrfs: "|grep -o -P ' UUID="[0-9a-f-]+" '|cut -d'"' -f2`
sed -i -E "s/^UUID=[0-9a-f-]+ *\/ .*$/UUID=$new_uuid \/ btrfs defaults 0 1/" /mnt/etc/fstab
for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done
chroot /mnt update-grub
for i in dev/pts dev proc sys; do umount /mnt/$i; done
umount /mnt
</syntaxhighlight>
In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start".
Launch the server and execute:
df -hT
It should show something like:
/dev/xvda1 btrfs 5G 1.4G 3.5G 28% /
Delete the old root disk.
== Troubleshootings ==
* During a conversion, the root filesystem was mounted read-only in btrfs; it was probably because I didn’t change the options "rw,noatime,errors=remount-ro" to "defaults"
== External links ==
* [https://wiki.xen.org/wiki/PvGrub2 PvGrub2 on Xen wiki]
eba8366bf50e3868516a5d0763de7dbe269e94cf
658157
658156
2023-06-15T15:43:23Z
Seb35
1
/* Scripted procedure */
wikitext
text/x-wiki
I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others. For an introduction, see [https://en.wikipedia.org/wiki/Btrfs Wikipedia article] and/or [https://btrfs.wiki.kernel.org the dedicated wiki].
WARNING: this could cause DATA LOSS, be sure you have backups (possibly Gandi snapshots).
This was updated on 2020-09-24 for Debian 10 buster + GandiV5, and on 2022-02-02 for Debian 11 bullseye + GandiV5. An [{{fullurl:Btrfs|oldid=658077}} older version] was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4.
== Manual procedure ==
=== Create the server ===
On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 MiB RAM, 1 system disk of 5 GiB, Debian 10 buster or Debian 11 bullseye.
For Debian 10 buster (only), define backports (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11):
echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list
Install btrfs-progs:
apt update && apt install -t buster-backports btrfs-progs # Debian 10 buster
apt update && apt install btrfs-progs # Debian 11 bullseye
On GandiV5 :
# stop the server,
# open the page about the system disk in Volumes,
# clone the system disk with another (definitive) name (e.g. the current disk is "sys-myserver", you can define the copied disk as "myserver"),
# start the server,
# wait until the server is started,
# attach this cloned disk to the server.
ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server).
=== Convert to btrfs ===
:''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]''
Display the active root filesystem, and you will be able to deduce what is the cloned filesystem:
ls /dev/xvd*
mount|grep xvd
blkid
Copy the result of <code>blkid</code> in some text file on your computer (will be used later).
Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert])
fsck.ext4 -f /dev/xvdb1 # optional
btrfs-convert -p /dev/xvdb1
Here, I obtained the following error:
root@test:~# btrfs-convert -p /dev/xvdb1
create btrfs filesystem:
blocksize: 4096
nodesize: 16384
features: extref, skinny-metadata (default)
creating ext2 image file
creating btrfs metadata
Unable to find block group for 0 27081]
Unable to find block group for 0
Unable to find block group for 0
ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1
btrfs-convert(+0x11b5a)[0x559c159c1b5a]
btrfs-convert(+0x1589b)[0x559c159c589b]
btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401]
btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c]
btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4]
btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92]
btrfs-convert(+0x10349)[0x559c159c0349]
btrfs-convert(+0x1135f)[0x559c159c135f]
btrfs-convert(main+0x1f59)[0x559c159bdefb]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97]
btrfs-convert(_start+0x2a)[0x559c159bb5ca]
Aborted
According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files)
btrfs-convert -d -p /dev/xvdb1
or even:
btrfs-convert -n -d -p /dev/xvdb1
Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)).
Then, mount the filesystem and delete the old ext4 snapshot:
mount /dev/xvdb1 /mnt
btrfs subvolume delete /mnt/ext2_saved
btrfs filesystem defrag -r /mnt # could take dozen of minuts
btrfs balance start /mnt # could take hours
=== Promote as root filesystem ===
:''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]''
Edit the /etc/fstab of the btrfs system:
uuid=`blkid|grep -P '^/dev/xvdb1: '|grep -o -P ' UUID="[0-9a-f-]+" '|cut -d'"' -f2`
sed -i -E 's/^UUID=[0-9a-f-]+ *\/ .*$/UUID=$uid \/ btrfs defaults 0 1/' /mnt/etc/fstab
Update Grub in a chrooted system:
for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done
chroot /mnt update-grub
for i in dev/pts dev proc sys; do umount /mnt/$i; done
umount /mnt
Quit:
exit
=== Define the cooked disk as boot disk ===
In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start".
Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)).
df -hT
It should show something like:
/dev/xvda1 btrfs 50G 32G 19G 63% /
Delete the old root disk.
You can delete the packages grub-efi-amd64, grub-efi-amd64-bin, grub-pc, grub-pc-bin since they are not used, but keep /etc/default/grub with Gandi customisations:
cp -a /etc/default/grub /root/grub
apt-get purge -y grub-efi-amd64 grub-efi-amd64-bin grub-pc grub-pc-bin
mv /root/grub /etc/default/grub
apt-mark manual grub-common grub2-common
update-grub # to check it still work and you should reboot now to be sure it reboots correctly
== Scripted procedure ==
This script automates the conversion, with a slightly-modified procedure.
On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 MiB RAM, 1 system disk of 5 GiB, Debian 11 bullseye.
On GandiV5 :
# stop the server,
# open the page about the system disk in Volumes,
# clone the system disk with another (definitive) name (e.g. the current disk is "sys-myserver", you can define the copied disk as "myserver"),
# start the server,
# wait until the server is started,
# attach this cloned disk to the server.
ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server).
# Launch this script as root: (<code>vi convert_gandiroot_to_btrfs.sh</code> + <code>chmod +x convert_gandiroot_to_btrfs.sh</code> + (<code>./convert_gandiroot_to_btrfs.sh</code>)
<syntaxhighlight lang="shell">
#!/bin/sh
set -e
fs_type=`mount|grep -F ' on / '|grep -o -E ' type [a-z0-9]+ '|cut -d' ' -f3`
blkid=`blkid|grep -F ' LABEL="gandiroot" '`
nb_fs_gandiroot=`echo "$blkid"|cut -d: -f2-|uniq -c|tr -s ' '|cut -d' ' -f2`
if [ "$fs_type" != 'ext4' -o ! "$nb_fs_gandiroot" = 2 ]; then
echo 'It is not possible to convert the disk. There should be two identical devices labeled "gandiroot" formatted in ext4'
exit 2
fi
fs_gandiroot_ext4=`echo "$blkid"|head -n1|cut -d: -f1`
fs_gandiroot_btrfs=`echo "$blkid"|tail -n1|cut -d: -f1`
echo
echo "Current root filesystem: $fs_gandiroot_ext4 (ext4)"
echo "Future root filesystem: $fs_gandiroot_btrfs (currently ext4, will be btrfs)"
set -v
apt-get update
apt-get install -y btrfs-progs
fsck.ext4 -f "$fs_gandiroot_btrfs"
btrfs-convert -p "$fs_gandiroot_btrfs"
mount "$fs_gandiroot_btrfs" /mnt
btrfs subvolume delete -C /mnt/ext2_saved
btrfs filesystem defragment -r /mnt
btrfs balance start /mnt
new_uuid=`blkid|grep -P "^$fs_gandiroot_btrfs: "|grep -o -P ' UUID="[0-9a-f-]+" '|cut -d'"' -f2`
sed -i -E "s/^UUID=[0-9a-f-]+ *\/ .*$/UUID=$new_uuid \/ btrfs defaults 0 1/" /mnt/etc/fstab
for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done
chroot /mnt update-grub
for i in dev/pts dev proc sys; do umount /mnt/$i; done
umount /mnt
</syntaxhighlight>
In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start".
Launch the server and execute:
df -hT
It should show something like:
/dev/xvda1 btrfs 5G 1.4G 3.5G 28% /
Delete the old root disk.
== Troubleshootings ==
* During a conversion, the root filesystem was mounted read-only in btrfs; it was probably because I didn’t change the options "rw,noatime,errors=remount-ro" to "defaults"
== External links ==
* [https://wiki.xen.org/wiki/PvGrub2 PvGrub2 on Xen wiki]
ea4ec4dccba602a366ce734ef628815fea4c4edc
Accueil
0
1
658109
658075
2021-04-12T08:42:48Z
Seb35
1
+avertissement : Git ne fonctionne plus
wikitext
text/x-wiki
Ce wiki me sert de base de connaissance dans le cadre des activités de [[:seb35:|mon entreprise]].
Il peut comporter des pages de contenu ou simplement des liens vers d’autres sites pour les activités collaboratives. Vous pouvez vous créer un compte si vous voulez discuter ou modifier une erreur. (En fait, j’ai désactivé l’inscription à cause du spam.)
Vous pouvez [[Extension:GitSynchro|télécharger l’historique de cette page avec Git]] : (ne fonctionne plus en 2021)
:<code>git clone <nowiki>http://wiki.seb35.fr/Accueil</nowiki></code>
== Pages du wiki ==
[[Special:Version]]
=== Tutoriaux ===
* [[Tutorial:Beautiful MediaWiki URLs]]
* [[Tutorial:Packaging de WebApps]]
=== Autres ===
* [[Présentation:Wikis]]
* [[CRM]] (comparaison de CRMs libres)
* [[Archéo Lex]]
* [[Syntaxes de formatage léger]]
* [[Log/Seb35]]
* [[MediaWiki]]
=== Technique ===
* [[Btrfs]] (en anglais)
* [[Unicode]]
c533a3581b309248802bebc7bdf0c87e7f416a9a
658117
658109
2021-07-07T10:59:05Z
Seb35
1
wikitext
text/x-wiki
Ce wiki me sert de base de connaissance dans le cadre des activités de [[:seb35:|mon entreprise]].
Il peut comporter des pages de contenu ou simplement des liens vers d’autres sites pour les activités collaboratives. Vous pouvez vous créer un compte si vous voulez discuter ou modifier une erreur. (En fait, j’ai désactivé l’inscription à cause du spam.)
Vous pouvez [[Extension:GitSynchro|télécharger l’historique de cette page avec Git]] : (ne fonctionne plus en 2021)
:<code>git clone <nowiki>http://wiki.seb35.fr/Accueil</nowiki></code>
== Pages du wiki ==
[[Special:Version]]
=== Tutoriaux ===
* [[Tutorial:Beautiful MediaWiki URLs]]
* [[Tutorial:Packaging de WebApps]]
=== Autres ===
* [[Présentation:Wikis]]
* [[CRM]] (comparaison de CRMs libres)
* [[Archéo Lex]]
* [[Syntaxes de formatage léger]]
* [[Log/Seb35]]
* [[MediaWiki]]
=== Technique ===
* [[Btrfs]] (en anglais)
* [[Unicode]]
* [[Firewall]]
3400277f0eda40b7904e57993411aaaca7cd79a0
658118
658117
2021-07-07T10:59:44Z
Seb35
1
+pare-feu
wikitext
text/x-wiki
Ce wiki me sert de base de connaissance dans le cadre des activités de [[:seb35:|mon entreprise]].
Il peut comporter des pages de contenu ou simplement des liens vers d’autres sites pour les activités collaboratives. Vous pouvez vous créer un compte si vous voulez discuter ou modifier une erreur. (En fait, j’ai désactivé l’inscription à cause du spam.)
Vous pouvez [[Extension:GitSynchro|télécharger l’historique de cette page avec Git]] : (ne fonctionne plus en 2021)
:<code>git clone <nowiki>http://wiki.seb35.fr/Accueil</nowiki></code>
== Pages du wiki ==
[[Special:Version]]
=== Tutoriaux ===
* [[Tutorial:Beautiful MediaWiki URLs]]
* [[Tutorial:Packaging de WebApps]]
=== Autres ===
* [[Présentation:Wikis]]
* [[CRM]] (comparaison de CRMs libres)
* [[Archéo Lex]]
* [[Syntaxes de formatage léger]]
* [[Log/Seb35]]
* [[MediaWiki]]
=== Technique ===
* [[Btrfs]] (en anglais)
* [[Unicode]]
* [[Pare-feu]]
48f617433b9d3f46c6a8e29549c5e54e595676b6
658126
658118
2021-07-31T17:59:21Z
Seb35
1
/* Pages du wiki */ +PrivateBin (désinstallé de mon serveur, je garde cette doc)
wikitext
text/x-wiki
Ce wiki me sert de base de connaissance dans le cadre des activités de [[:seb35:|mon entreprise]].
Il peut comporter des pages de contenu ou simplement des liens vers d’autres sites pour les activités collaboratives. Vous pouvez vous créer un compte si vous voulez discuter ou modifier une erreur. (En fait, j’ai désactivé l’inscription à cause du spam.)
Vous pouvez [[Extension:GitSynchro|télécharger l’historique de cette page avec Git]] : (ne fonctionne plus en 2021)
:<code>git clone <nowiki>http://wiki.seb35.fr/Accueil</nowiki></code>
== Pages du wiki ==
[[Special:Version]]
=== Tutoriaux ===
* [[Tutorial:Beautiful MediaWiki URLs]]
* [[Tutorial:Packaging de WebApps]]
=== Autres ===
* [[Présentation:Wikis]]
* [[CRM]] (comparaison de CRMs libres)
* [[Archéo Lex]]
* [[Syntaxes de formatage léger]]
* [[Log/Seb35]]
* [[MediaWiki]]
=== Technique ===
* [[Btrfs]] (en anglais)
* [[Unicode]]
* [[Pare-feu]]
* [[PrivateBin]]
0d4214706a68f58154076b5cb7700f0ccc0f0f4e
Legi.py
0
194
658110
2021-05-09T17:08:02Z
Seb35
1
création de documentation, pour moi ou toute personne intéressée
wikitext
text/x-wiki
En légistique numérique, '''legi.py''' transforme la base de données LEGI, contenant les lois consolidées, produite officiellement par la DILA et consistant en des fichiers XML, en une base SQL (SQLite uniquement).
Ce programme est écrit en Python 3.7, dont l’auteur principal est le développeur Changaco et dont la licence est CC0.
Dans la chaîne de traitement, legi.py est utilisé en première partie ; Archéo Lex utilise notamment la colonne sur la date de dernière mise à jour pour ne modifier que les nouveautés du jour. Dans [https://github.com/Legilibre/legi.py/pull/54 une Pull Request] que, idéalement, je finalise, legi.py pourrait être étendu à la base de données JORF contenant notamment les lois dans leur version initiale, chose manquante dans LEGI. Plus loin, il s’agirait de mettre en correspondance les bases JORF et LEGI [https://github.com/Legilibre/legi.py/issues/70].
== Installation sous Debian 10 sur un serveur ==
:''Cette section explique comment installer avec Git legi.py et mettre en place les mises à jour quotidiennes.''
…
ea6662230a68bc3b5c081171e81e8273c2f5be20
658111
658110
2021-05-09T17:57:24Z
Seb35
1
/* Installation sous Debian 10 sur un serveur */ ++
wikitext
text/x-wiki
En légistique numérique, '''legi.py''' transforme la base de données LEGI, contenant les lois consolidées, produite officiellement par la DILA et consistant en des fichiers XML, en une base SQL (SQLite uniquement).
Ce programme est écrit en Python 3.7, dont l’auteur principal est le développeur Changaco et dont la licence est CC0.
Dans la chaîne de traitement, legi.py est utilisé en première partie ; Archéo Lex utilise notamment la colonne sur la date de dernière mise à jour pour ne modifier que les nouveautés du jour. Dans [https://github.com/Legilibre/legi.py/pull/54 une Pull Request] que, idéalement, je finalise, legi.py pourrait être étendu à la base de données JORF contenant notamment les lois dans leur version initiale, chose manquante dans LEGI. Plus loin, il s’agirait de mettre en correspondance les bases JORF et LEGI [https://github.com/Legilibre/legi.py/issues/70].
== Installation sous Debian 10 ==
:''Cette section explique comment installer avec Git legi.py et mettre en place les mises à jour quotidiennes.''
On utilise sudo lorsque nécessaire uniquement. Écrit et testé en mai 2021.
Le code de legi.py sera placé dans <code>/opt/legi.py</code>, les données XML officielles dans <code>/srv/data/legi/xml</code> et la base de données résultat dans <code>/srv/data/legi/sql</code>.
; Pré-requis
* Système : Debian 10
* Connectivité : IPv4 nécessaire (d’une part pour le téléchargement sur Github puisque celui-ci n’a pas encore l’IPv6 [sic], d’autre part pour les téléchargements quotidiens depuis la DILA)
; Installation des dépendances
Paquets généraux :
<code>
sudo apt-get install -y git gcc g++ python3-pip python3-setuptools python3-dev
</code>
(à part git, les suivants sont nécessaires pour la compilation du paquet Python « hunspell » lors de l’installation avec pip)
Paquets spécifiques :
<code>
sudo apt-get install -y libarchive13 hunspell hunspell-fr libhunspell-dev
</code>
; Installation de legi.py
<code>
sudo mkdir /opt/legi.py
sudo chown $USER: /opt/legi.py
git clone https://github.com/Legilibre/legi.py /opt/legi.py
</code>
3a4b2faddd3ab0ee45e2f6ade2ff9349bfc6ecd8
658112
658111
2021-05-09T19:57:52Z
Seb35
1
/* Installation sous Debian 10 */ procédure telle que faite à l’instant
wikitext
text/x-wiki
En légistique numérique, '''legi.py''' transforme la base de données LEGI, contenant les lois consolidées, produite officiellement par la DILA et consistant en des fichiers XML, en une base SQL (SQLite uniquement).
Ce programme est écrit en Python 3.7, dont l’auteur principal est le développeur Changaco et dont la licence est CC0.
Dans la chaîne de traitement, legi.py est utilisé en première partie ; Archéo Lex utilise notamment la colonne sur la date de dernière mise à jour pour ne modifier que les nouveautés du jour. Dans [https://github.com/Legilibre/legi.py/pull/54 une Pull Request] que, idéalement, je finalise, legi.py pourrait être étendu à la base de données JORF contenant notamment les lois dans leur version initiale, chose manquante dans LEGI. Plus loin, il s’agirait de mettre en correspondance les bases JORF et LEGI [https://github.com/Legilibre/legi.py/issues/70].
== Installation sous Debian 10 ==
:''Cette section explique comment installer legi.py avec Git et mettre en place les mises à jour quotidiennes. Procédure écrite et testée en mai 2021.''
Le code de legi.py sera placé dans <code>/opt/legi.py</code>, les données XML officielles dans <code>/srv/data/legi/xml</code> et la base de données résultat dans <code>/srv/data/legi/sql</code>.
Les commandes sont ici utilisées avec sudo puisque cela a vocation à être un service « système ».
; Pré-requis
* Système : Debian 10
* Connectivité : IPv4 nécessaire (d’une part pour le téléchargement sur Github puisque celui-ci n’a pas encore l’IPv6 [sic], d’autre part pour les téléchargements quotidiens depuis la DILA)
* Ressources :
** téléchargement initial : ≈ 3 Gio
** téléchargements quotidiens : ≈ 1 Mio, sauf lors d’un ré-export complet de la base XML une fois par an (≈ 1 Gio dans ce cas)
** stockage du XML compressé : ≈ 3-4 Gio
** stockage de la base SQL : ≈ 4 Gio
** CPU/mémoire : peu consommateur sauf lors du calcul initial, 1-2 Gio est suffisant, avoir plus de ressources augmente la vitesse notamment du calcul initial
=== Installation des dépendances ===
Paquets généraux :
sudo apt-get install -y git gcc g++ python3-pip python3-setuptools python3-dev
À part git, les suivants sont nécessaires pour la compilation du paquet Python « hunspell » lors de l’installation avec pip.
Paquets spécifiques :
sudo apt-get install -y libarchive13 hunspell hunspell-fr libhunspell-dev
=== Installation de legi.py ===
sudo mkdir /opt/legi.py
sudo git clone <nowiki>https://github.com/Legilibre/legi.py</nowiki> /opt/legi.py
cd /opt/legi.py
sudo pip3 install -r requirements.txt
=== Création de la mise à jour quotidienne ===
Cette mise à jour est programmée avec un timer systemd et un utilisateur système dédié.
Noter que la mise à jour est programmée ici du lundi au vendredi entre 23:15 et 23:30 et toutes les 12 heures : selon [https://github.com/Legilibre/salon/issues/18 ces stats], l’heure de livraison étant variable, souvent entre 21:00 et 23:00, mais parfois plus tard ; on pourrait programmer une vérification de la présence de livraison du jour à partir de 20:00 (ce que je fais pour Archéo Lex). La vérification toutes les 12 heures est notamment pour le cas d’un ordinateur de bureau, pas forcément allumé en soirée.
Sur la pérennité de la livraison via FTP, il a été annoncé par la DILA le 29 novembre 2019 (lors de l’inauguration des nouvelles API) que cela était pérenne.
Note d’implémentation : j’utilise ici wget pour faire le téléchargement même si legi.py a un utilitaire dédié, plus par conviction personnelle qu’il est préférable d’utiliser les outils existants plutôt que de les réimplémenter.
sudo adduser --system --home / --shell /usr/bin/sh --no-create-home --disabled-password legi
sudo mkdir -p /usr/local/lib/systemd/system
sudo vi /usr/local/lib/systemd/system/legi-database-update.service # copier le contenu ci-dessous
sudo vi /usr/local/lib/systemd/system/legi-database-update.timer # copier le contenu ci-dessous
sudo systemctl daemon-reload
sudo mkdir -p /var/log/legi /srv/data/legi/{xml,sql}
sudo chown -R legi /var/log/legi /srv/data/legi
sudo systemctl start legi-database-update.timer
sudo systemctl enable legi-database-update.timer
; /usr/local/lib/systemd/system/legi-database-update.service
[Unit]
Description=LEGI database update
Documentation=<nowiki>https://github.com/Legilibre/legi.py</nowiki>
[Service]
Type=oneshot
WorkingDirectory=/opt/legi.py
ExecStartPre=wget -c -N --no-remove-listing --no-verbose -nH -P /srv/data/legi/xml '<nowiki>ftp://echanges.dila.gouv.fr/LEGI/*.tar.gz</nowiki>'
ExecStart=python3 -m legi.tar2sqlite /srv/data/legi/sql/legi.sqlite /srv/data/legi/xml
User=legi
StandardOutput=file:/var/log/legi/update.log
; /usr/local/lib/systemd/system/legi-database-update.timer
[Unit]
Description=Run LEGI database update
[Timer]
OnCalendar=Mon..Fri *-*-* 11/12:15:00
RandomizedDelaySec=900
[Install]
WantedBy=timers.target
=== Lancement initial ===
On peut lancer le calcul initial tout de suite :
sudo systemctl start legi-database-update.service --no-block
sudo systemctl status legi-database-update.service
Ce calcul initial mettra quelques heures, variable selon la vitesse de téléchargement et les ressources CPU/mémoire disponible.
== Utilisation au quotidien ==
sqlite3 /srv/data/legi/sql/legi.sqlite
5b8ab71e444f5a0b2380efb9f04b470f42dd85d4
658113
658112
2021-05-09T19:59:11Z
Seb35
1
détail
wikitext
text/x-wiki
En légistique numérique, '''legi.py''' transforme la base de données LEGI, contenant les lois consolidées, produite officiellement par la DILA et consistant en des fichiers XML, en une base SQL (SQLite uniquement).
Ce programme est écrit en Python 3.7, dont l’auteur principal est le développeur Changaco et dont la licence est CC0.
Dans la chaîne de traitement de [[Archéo Lex]], legi.py est utilisé en première partie ; Archéo Lex utilise notamment la colonne sur la date de dernière mise à jour pour ne modifier que les nouveautés du jour. Dans [https://github.com/Legilibre/legi.py/pull/54 une Pull Request] que, idéalement, je finalise, legi.py pourrait être étendu à la base de données JORF contenant notamment les lois dans leur version initiale, chose manquante dans LEGI. Plus loin, il s’agirait de mettre en correspondance les bases JORF et LEGI [https://github.com/Legilibre/legi.py/issues/70].
== Installation sous Debian 10 ==
:''Cette section explique comment installer legi.py avec Git et mettre en place les mises à jour quotidiennes.''
:''Procédure écrite et testée en mai 2021.''
Le code de legi.py sera placé dans <code>/opt/legi.py</code>, les données XML officielles dans <code>/srv/data/legi/xml</code> et la base de données résultat dans <code>/srv/data/legi/sql</code>.
Les commandes sont ici utilisées avec sudo puisque cela a vocation à être un service « système ».
; Pré-requis
* Système : Debian 10
* Connectivité : IPv4 nécessaire (d’une part pour le téléchargement sur Github puisque celui-ci n’a pas encore l’IPv6 [sic], d’autre part pour les téléchargements quotidiens depuis la DILA)
* Ressources :
** téléchargement initial : ≈ 3 Gio
** téléchargements quotidiens : ≈ 1 Mio, sauf lors d’un ré-export complet de la base XML une fois par an (≈ 1 Gio dans ce cas)
** stockage du XML compressé : ≈ 3-4 Gio
** stockage de la base SQL : ≈ 4 Gio
** CPU/mémoire : peu consommateur sauf lors du calcul initial, 1-2 Gio est suffisant, avoir plus de ressources augmente la vitesse notamment du calcul initial
=== Installation des dépendances ===
Paquets généraux :
sudo apt-get install -y git gcc g++ python3-pip python3-setuptools python3-dev
À part git, les suivants sont nécessaires pour la compilation du paquet Python « hunspell » lors de l’installation avec pip.
Paquets spécifiques :
sudo apt-get install -y libarchive13 hunspell hunspell-fr libhunspell-dev
=== Installation de legi.py ===
sudo mkdir /opt/legi.py
sudo git clone <nowiki>https://github.com/Legilibre/legi.py</nowiki> /opt/legi.py
cd /opt/legi.py
sudo pip3 install -r requirements.txt
=== Création de la mise à jour quotidienne ===
Cette mise à jour est programmée avec un timer systemd et un utilisateur système dédié.
Noter que la mise à jour est programmée ici du lundi au vendredi entre 23:15 et 23:30 et toutes les 12 heures : selon [https://github.com/Legilibre/salon/issues/18 ces stats], l’heure de livraison étant variable, souvent entre 21:00 et 23:00, mais parfois plus tard ; on pourrait programmer une vérification de la présence de livraison du jour à partir de 20:00 (ce que je fais pour Archéo Lex). La vérification toutes les 12 heures est notamment pour le cas d’un ordinateur de bureau, pas forcément allumé en soirée.
Sur la pérennité de la livraison via FTP, il a été annoncé par la DILA le 29 novembre 2019 (lors de l’inauguration des nouvelles API) que cela était pérenne.
Note d’implémentation : j’utilise ici wget pour faire le téléchargement même si legi.py a un utilitaire dédié, plus par conviction personnelle qu’il est préférable d’utiliser les outils existants plutôt que de les réimplémenter.
sudo adduser --system --home / --shell /usr/bin/sh --no-create-home --disabled-password legi
sudo mkdir -p /usr/local/lib/systemd/system
sudo vi /usr/local/lib/systemd/system/legi-database-update.service # copier le contenu ci-dessous
sudo vi /usr/local/lib/systemd/system/legi-database-update.timer # copier le contenu ci-dessous
sudo systemctl daemon-reload
sudo mkdir -p /var/log/legi /srv/data/legi/{xml,sql}
sudo chown -R legi /var/log/legi /srv/data/legi
sudo systemctl start legi-database-update.timer
sudo systemctl enable legi-database-update.timer
; /usr/local/lib/systemd/system/legi-database-update.service
[Unit]
Description=LEGI database update
Documentation=<nowiki>https://github.com/Legilibre/legi.py</nowiki>
[Service]
Type=oneshot
WorkingDirectory=/opt/legi.py
ExecStartPre=wget -c -N --no-remove-listing --no-verbose -nH -P /srv/data/legi/xml '<nowiki>ftp://echanges.dila.gouv.fr/LEGI/*.tar.gz</nowiki>'
ExecStart=python3 -m legi.tar2sqlite /srv/data/legi/sql/legi.sqlite /srv/data/legi/xml
User=legi
StandardOutput=file:/var/log/legi/update.log
; /usr/local/lib/systemd/system/legi-database-update.timer
[Unit]
Description=Run LEGI database update
[Timer]
OnCalendar=Mon..Fri *-*-* 11/12:15:00
RandomizedDelaySec=900
[Install]
WantedBy=timers.target
=== Lancement initial ===
On peut lancer le calcul initial tout de suite :
sudo systemctl start legi-database-update.service --no-block
sudo systemctl status legi-database-update.service
Ce calcul initial mettra quelques heures, variable selon la vitesse de téléchargement et les ressources CPU/mémoire disponible.
== Utilisation au quotidien ==
sqlite3 /srv/data/legi/sql/legi.sqlite
fbb09e9cf8cae942613744ae264130982315aab7
Git
0
195
658114
2021-05-10T07:42:45Z
Seb35
1
Page créée avec « Diverses astuces à propos de Git == Messages d’erreur == === <code>fatal: impossible de trouve le nom pour le sous-module 'data'</code> === En anglais : <code>fatal... »
wikitext
text/x-wiki
Diverses astuces à propos de Git
== Messages d’erreur ==
=== <code>fatal: impossible de trouve le nom pour le sous-module 'data'</code> ===
En anglais : <code>fatal: could not lookup name for submodule 'data'</code>.
'''Problème :''' Message d’erreur fatale lors de la commande <code>git submodule absorbgitdirs</code>. J’avais enregistré un sous-module contenant lui-même un dossier <code>.git</code> et essayait d’absorber ce dossier <code>.git</code> du sous-module dans le dossier <code>.git/modules/data</code> du superprojet.
'''Résolution :''' le sous-module n’était pas inscrit dans le fichier <code>.gitmodules</code> du superprojet, il faut l’y inscrire et relancer la commande.
f05bc345c7095b274347e9b81fbb16724c0f6bd6
Pare-feu
0
196
658119
2021-07-07T11:16:43Z
Seb35
1
qq notes sur les pare-feu, à compléter dans la durée, ici DHCP
wikitext
text/x-wiki
Liste de quelques règles à autoriser (ou non), non-exhaustif.
Écrit en syntaxe nft.
== DHCP ==
=== Poste client ===
En IPv4,
* accepter les requêtes sortantes vers un serveur DHCP (ip … → 255.255.255.255 udp 68 → 67) ;
* accepter les requêtes entrantes permettant la réponse (ip … → 255.255.255.255 udp 67 → 68) ;
* oublier les requêtes entrantes venant d’autres clients à destination des serveurs DHCP (udp … → 67).
chain input {
type filter hook input priority 0;
ip daddr 255.255.255.255 udp sport 67 udp dport 68 counter accept comment "DHCP client"
udp dport 67 counter drop comment "DHCP from other clients"
}
chain output {
type filter hook output priority 0;
ip daddr 255.255.255.255 udp sport 68 udp dport 67 counter accept comment "DHCP client"
}
23f19cd43c2952bef8d0d618e8d4fdcc8c59cd79
Monorepo Git
0
197
658120
2021-07-19T11:54:08Z
Seb35
1
étude
wikitext
text/x-wiki
Cette page est une étude pour trouver la meilleure solution de faire un monorepo Git, ou plus exactement, idéalement, un repo Git qui serait à la fois :
* un monorepo (qu’on puisse télécharger en une seule fois)
* un multi-repo où certains dossiers serait des repo Git ayant leur historique autonome.
Dans les contraintes que j’impose, il faut :
* que les solutions potentielles soient possibles en l’état actuel de Git ou, a maximum, un programme Bourne shell d’une taille relativement faible (afin d’être compatible sur un maximum de plate-formes et qu’il reste lisible et compréhensible),
* il peut y avoir une forme d’équivalence entre deux états "monorepo" et "multirepo" évenutuellement disticts mais switchable avec une commande,
* les commandes standard Git devraient fonctionner, au moins dans un certain état "monorepo"/"multirepo" s’ils sont distincts,
* la performance doit rester acceptable <small>(je sais, c’est vague et ça dépend des situations)</small>.
Les cas d’usage que je prévoie sont :
* pour Archéo Lex : pouvoir aggréger l’ensemble des lois françaises dans un seul monorepo mais en ayant la possibilité de télécharger seulement des sous-ensembles, par exemples les décrets,
* pour MediaWiki : pouvoir avoir le logiciel de base (un repo) avec les extensions (chacun dans un repo) où le déploiement est un monorepo comportant la version de base + les extensions déployées dans une certaine version, éventuellement patchée.
== Briques de base ==
Sous-modules Git (voir gitsubmodules(7))
Espaces de noms Git (voir gitnamespaces(7))
Dépôt distant de type ''ext'' (voir git-remote-ext(1))
Ilôts delta ''(delta islands)'' (voir git-pack-objects(1))
Les options de configuration, par exemple "diff.submodule"
cc07a74b8cbe2db6a63bc2614230d97198d4e70f
658121
658120
2021-07-19T12:59:11Z
Seb35
1
++pour les git submodules
wikitext
text/x-wiki
Cette page est une étude pour trouver la meilleure solution de faire un monorepo Git, ou plus exactement, idéalement, un repo Git qui serait à la fois :
* un monorepo (qu’on puisse télécharger en une seule fois)
* un multi-repo où certains dossiers serait des repo Git ayant leur historique autonome.
Dans les contraintes imposées, il faut :
* que les solutions potentielles soient possibles en l’état actuel de Git ou, a maximum, un programme Bourne shell d’une taille relativement faible (afin d’être compatible sur un maximum de plate-formes et qu’il reste lisible et compréhensible),
* il peut y avoir une forme d’équivalence entre deux états "monorepo" et "multirepo" évenutuellement disticts mais switchable avec une commande,
* les commandes standard Git devraient fonctionner, au moins dans un certain état "monorepo"/"multirepo" s’ils sont distincts,
* la performance doit rester acceptable <small>(je sais, c’est vague et ça dépend des situations)</small>.
== Cas d’usage ==
Les cas d’usage que je prévoie sont :
* pour Archéo Lex : pouvoir aggréger l’ensemble des lois françaises dans un seul monorepo (au niveau stockage) mais en ayant la possibilité de télécharger seulement des sous-ensembles, par exemples les décrets,
* pour MediaWiki : pouvoir avoir le logiciel de base (un repo) avec les extensions (chacun dans un repo) où le déploiement est un monorepo comportant la version de base + les extensions déployées dans une certaine version, éventuellement patchée.
== Briques de base ==
Sous-modules Git (voir gitsubmodules(7))
''alternates'' (voir gitrepository-layout(5))
Espaces de noms Git (voir gitnamespaces(7))
Dépôt distant de type ''ext'' (voir git-remote-ext(1))
Ilôts delta ''(delta islands)'' (voir git-pack-objects(1))
Les options de configuration, par exemple "diff.submodule"
== Briques de solution ==
== Plusieurs repos indépendants ==
Ceci n’est pas une solution au problème exposé car il n’y a jamais de monorepo, au sens que la version globale et unifiée d’un repo et de ses sous-repos n’est jamais présente. C’est toutefois une partie d’une éventuelle solution, intégrée à une autre brique de solution.
Méthode :
* Faire un repo Git « parent »
* Ajouter les repos Git « enfants » avec des `git clone` dans des dossiers du repo parent
* Faire des `git commit` dans chacun des enfants et du parent
…
=== Sous-modules classiques ===
Méthode :
* Faire un repo Git « parent »
* Ajouter les repos Git « enfants »
*# Ajouter les sous-modules avec `git submodule add|init|update`
*# Ajouter un repo Git normal dans un dossier, puis, dans le repo parent, faire un git-add(1) (il y a un avertissement, c’est normal), puis git-submodule(1) (absorbgitdirs) sur ce dossier pour transférer le dossier <enfant>/.git dans <parent>/.git/modules/<enfant>
* `git commit` dans le repo parent pour enregistrer la version
* `git submodule deinit` pour retirer le sous-module
Avantages :
* Très standard depuis longtemps, au moins pour l’organisation et les commandes de base
* Gestion de la récursion (enfants d’enfants)
* En local, tout l’historique est dans le dossier <parent>/.git
Inconvénients :
* Les repo enfants ne font pas partie du repo parent :
*# En cas d’accès distant, il faut rendre les repos enfants accessibles
*# En cas de clone du repo parent, seul le repo parent est téléchargé par défaut
*#: Cela peut être changé au cas par cas avec `git clone --recurse-submodules` ou configuré de façon permanente avec "submodule.recurse", "fetch.recurseSubmodules" et "submodule.<name>.fetchRecurseSubmodules"
*# Lors d’un push, il faut pousser aussi les repos enfants
*#: Cela peut être changé au cas par cas avec `git push --recurse-submodules=check|on-demand|no` configuré de façon permanente avec "submodule.recurse" et "push.recurseSubmodules"
*# La compression est donc dégradée par rapport à un object store global
*# La perfomance lors d’un clone est dégradée par rapport à un clone global
* En cas de changement de branche (pour un repo ayant un work tree) :
** il y a des avertissements si les branches source et destination ont des repos enfants ayant des statuts "enregistré dans un commit"/"non-enregistré dans un commit" différents (dans le 2e cas, ça peut être un dossier "non suivi" ou "ignoré")
** il faut synchroniser a posteriori les repos enfants : si on oublie, on est alors dans un état intermédiaire entre deux commits
* L’algorithme de fusion ne fusionne pas à l’intérieur des sous-modules
*: Il faut fusionner chacun des sous-modules puis, lors de la fusion du repo parent, résoudre le conflit de fusion en préférant les commits fusionnés des repos enfants
* Il n’y a pas d’ordre canonique dans le fichier .gitmodules
*: Les commandes `git submodule add` ajoutent à la fin du fichier les nouveaux sous-modules
*: En cas de fusion, même si deux fichiers .gitmodules sont sémantiquement identiques (mêmes sous-modules, mêmes paramètres pour chaque sous-module), il peut y avoir un conflit de fusion sur ce fichier
* Lors du checkout, la référence HEAD des sous-modules pointe vers un commit et non vers la branche indiquée dans le fichier .gitmodules
*: Il est moins aisé de mettre à jour en masse les sous-modules (par exemple dans MediaWiki, dans le principal dépôt d’extensions (Gerrit), les extensions MediaWiki sont dans des branches correspondant à la version majeure de MediaWiki (par exemple REL1_35 pour la branche majeure 1.35) : par défaut il n’est pas possible de faire un `git submodule foreach git fetch` ou `git iterate -- fetch` (programme complémentaire git-iterate)
* Le support des sous-modules évolue (en s’améliorant amha) mais certaines commandes ou options de configuration n’étaient pas disponibles à l’origine
*: Cela amoindrit la facilité d’utilisation pour les anciennes versions de Git
183cab411c2ed70c089e94b8eb100e9d726599af
658122
658121
2021-07-19T16:10:23Z
Seb35
1
+Monorepo
wikitext
text/x-wiki
Cette page est une étude pour trouver la meilleure solution de faire un monorepo Git, ou plus exactement, idéalement, un repo Git qui serait à la fois :
* un monorepo (qu’on puisse télécharger en une seule fois)
* un multi-repo où certains dossiers serait des repo Git ayant leur historique autonome.
Dans les contraintes imposées, il faut :
* que les solutions potentielles soient possibles en l’état actuel de Git ou, a maximum, un programme Bourne shell d’une taille relativement faible (afin d’être compatible sur un maximum de plate-formes et qu’il reste lisible et compréhensible),
* il peut y avoir une forme d’équivalence entre deux états "monorepo" et "multirepo" évenutuellement disticts mais switchable avec une commande,
* les commandes standard Git devraient fonctionner, au moins dans un certain état "monorepo"/"multirepo" s’ils sont distincts,
* la performance doit rester acceptable <small>(je sais, c’est vague et ça dépend des situations)</small>.
== Cas d’usage ==
Les cas d’usage que je prévoie sont :
* pour Archéo Lex : pouvoir aggréger l’ensemble des lois françaises dans un seul monorepo (au niveau stockage) mais en ayant la possibilité de télécharger seulement des sous-ensembles, par exemples les décrets,
* pour MediaWiki : pouvoir avoir le logiciel de base (un repo) avec les extensions (chacun dans un repo) où le déploiement est un monorepo comportant la version de base + les extensions déployées dans une certaine version, éventuellement patchée.
== Briques de base ==
Sous-modules Git (voir gitsubmodules(7))
''alternates'' (voir gitrepository-layout(5))
Espaces de noms Git (voir gitnamespaces(7))
Dépôt distant de type ''ext'' (voir git-remote-ext(1))
Ilôts delta ''(delta islands)'' (voir git-pack-objects(1))
Les options de configuration, par exemple "diff.submodule"
== Briques de solution ==
== Plusieurs repos indépendants ==
Ceci n’est pas une solution au problème exposé car il n’y a jamais de monorepo, au sens que la version globale et unifiée d’un repo et de ses sous-repos n’est jamais présente. C’est toutefois une partie d’une éventuelle solution, intégrée à une autre brique de solution.
Méthode :
* Faire un repo Git « parent »
* Ajouter les repos Git « enfants » avec des `git clone` dans des dossiers du repo parent
* Faire des `git commit` dans chacun des enfants et du parent
…
=== Sous-modules classiques ===
Méthode :
* Faire un repo Git « parent »
* Ajouter les repos Git « enfants »
*# Ajouter les sous-modules avec `git submodule add|init|update`
*# Ajouter un repo Git normal dans un dossier, puis, dans le repo parent, faire un git-add(1) (il y a un avertissement, c’est normal), puis git-submodule(1) (absorbgitdirs) sur ce dossier pour transférer le dossier <enfant>/.git dans <parent>/.git/modules/<enfant>
* `git commit` dans le repo parent pour enregistrer la version
* `git submodule deinit` pour retirer le sous-module
Avantages :
* Très standard depuis longtemps, au moins pour l’organisation et les commandes de base
* Gestion de la récursion (enfants d’enfants)
* En local, tout l’historique est dans le dossier <parent>/.git
Inconvénients :
* Les repo enfants ne font pas partie du repo parent :
*# En cas d’accès distant, il faut rendre les repos enfants accessibles
*# En cas de clone du repo parent, seul le repo parent est téléchargé par défaut
*#: Cela peut être changé au cas par cas avec `git clone --recurse-submodules` ou configuré de façon permanente avec "submodule.recurse", "fetch.recurseSubmodules" et "submodule.<name>.fetchRecurseSubmodules"
*# Lors d’un push, il faut pousser aussi les repos enfants
*#: Cela peut être changé au cas par cas avec `git push --recurse-submodules=check|on-demand|no` configuré de façon permanente avec "submodule.recurse" et "push.recurseSubmodules"
*# La compression est donc dégradée par rapport à un object store global
*# La perfomance lors d’un clone est dégradée par rapport à un clone global
* En cas de changement de branche (pour un repo ayant un work tree) :
** il y a des avertissements si les branches source et destination ont des repos enfants ayant des statuts "enregistré dans un commit"/"non-enregistré dans un commit" différents (dans le 2e cas, ça peut être un dossier "non suivi" ou "ignoré")
** il faut synchroniser a posteriori les repos enfants : si on oublie, on est alors dans un état intermédiaire entre deux commits
* L’algorithme de fusion ne fusionne pas à l’intérieur des sous-modules
*: Il faut fusionner chacun des sous-modules puis, lors de la fusion du repo parent, résoudre le conflit de fusion en préférant les commits fusionnés des repos enfants
* Il n’y a pas d’ordre canonique dans le fichier .gitmodules
*: Les commandes `git submodule add` ajoutent à la fin du fichier les nouveaux sous-modules
*: En cas de fusion, même si deux fichiers .gitmodules sont sémantiquement identiques (mêmes sous-modules, mêmes paramètres pour chaque sous-module), il peut y avoir un conflit de fusion sur ce fichier
* Lors du checkout, la référence HEAD des sous-modules pointe vers un commit et non vers la branche indiquée dans le fichier .gitmodules
*: Il est moins aisé de mettre à jour en masse les sous-modules (par exemple dans MediaWiki, dans le principal dépôt d’extensions (Gerrit), les extensions MediaWiki sont dans des branches correspondant à la version majeure de MediaWiki (par exemple REL1_35 pour la branche majeure 1.35) : par défaut il n’est pas possible de faire un `git submodule foreach git fetch` ou `git iterate -- fetch` (programme complémentaire git-iterate)
* Le support des sous-modules évolue (en s’améliorant amha) mais certaines commandes ou options de configuration n’étaient pas disponibles à l’origine
*: Cela amoindrit la facilité d’utilisation pour les anciennes versions de Git
=== Monorepo ===
Méthode :
* Faire un repo Git « parent »
* Ajouter les repos Git « enfants » avec des `git clone` ou `git submodule add|init` dans des dossiers du repo parent
* Faire un `git add .` dans le repo parent
* Retirer les dossiers <enfant>/.git et <parent>/.git/modules
* Faire des `git commit` dans le parent
Avantages :
* L’ensemble des fichiers est toujours cohérent (pas d’état intermédiaire comparé aux sous-modules, par exemple lorsqu’on change de branche sans faire un `git submodule update`)
* Un `git clone` télécharge l’ensemble des fichiers
Inconvénients :
* Les historiques d’origine des enfants sont perdus
*: Les liens avec les repos enfants étant perdus, ces dossiers vont évoluer de façon différente du repo "officiel", créant de facto des forks
d18d3bf11f8f466248024de0f8bc9d61de109316
658123
658122
2021-07-19T16:38:03Z
Seb35
1
+Monorepo avec des repos enfants via des espaces de noms et remote-ext
wikitext
text/x-wiki
Cette page est une étude pour trouver la meilleure solution de faire un monorepo Git, ou plus exactement, idéalement, un repo Git qui serait à la fois :
* un monorepo (qu’on puisse télécharger en une seule fois)
* un multi-repo où certains dossiers serait des repo Git ayant leur historique autonome.
Dans les contraintes imposées, il faut :
* que les solutions potentielles soient possibles en l’état actuel de Git ou, a maximum, un programme Bourne shell d’une taille relativement faible (afin d’être compatible sur un maximum de plate-formes et qu’il reste lisible et compréhensible),
* il peut y avoir une forme d’équivalence entre deux états "monorepo" et "multirepo" évenutuellement disticts mais switchable avec une commande,
* les commandes standard Git devraient fonctionner, au moins dans un certain état "monorepo"/"multirepo" s’ils sont distincts,
* la performance doit rester acceptable <small>(je sais, c’est vague et ça dépend des situations)</small>.
== Cas d’usage ==
Les cas d’usage que je prévoie sont :
* pour Archéo Lex : pouvoir aggréger l’ensemble des lois françaises dans un seul monorepo (au niveau stockage) mais en ayant la possibilité de télécharger seulement des sous-ensembles, par exemples les décrets,
* pour MediaWiki : pouvoir avoir le logiciel de base (un repo) avec les extensions (chacun dans un repo) où le déploiement est un monorepo comportant la version de base + les extensions déployées dans une certaine version, éventuellement patchée.
== Briques de base ==
Sous-modules Git (voir gitsubmodules(7))
''alternates'' (voir gitrepository-layout(5))
Espaces de noms Git (voir gitnamespaces(7))
Dépôt distant de type ''ext'' (voir git-remote-ext(1))
Ilôts delta ''(delta islands)'' (voir git-pack-objects(1))
Les options de configuration, par exemple "diff.submodule"
== Briques de solution ==
=== Plusieurs repos indépendants ===
Ceci n’est pas une solution au problème exposé car il n’y a jamais de monorepo, au sens que la version globale et unifiée d’un repo et de ses sous-repos n’est jamais présente. C’est toutefois une partie d’une éventuelle solution, intégrée à une autre brique de solution.
Méthode :
* Faire un repo Git « parent »
* Ajouter les repos Git « enfants » avec des `git clone` dans des dossiers du repo parent
* Faire des `git commit` dans chacun des enfants et du parent
…
=== Sous-modules classiques ===
Méthode :
* Faire un repo Git « parent »
* Ajouter les repos Git « enfants »
*# Ajouter les sous-modules avec `git submodule add|init|update`
*# Ajouter un repo Git normal dans un dossier, puis, dans le repo parent, faire un git-add(1) (il y a un avertissement, c’est normal), puis git-submodule(1) (absorbgitdirs) sur ce dossier pour transférer le dossier <enfant>/.git dans <parent>/.git/modules/<enfant>
* `git commit` dans le repo parent pour enregistrer la version
* `git submodule deinit` pour retirer le sous-module
Avantages :
* Très standard depuis longtemps, au moins pour l’organisation et les commandes de base
* Gestion de la récursion (enfants d’enfants)
* En local, tout l’historique est dans le dossier <parent>/.git
Inconvénients :
* Les repo enfants ne font pas partie du repo parent :
*# En cas d’accès distant, il faut rendre les repos enfants accessibles
*# En cas de clone du repo parent, seul le repo parent est téléchargé par défaut
*#: Cela peut être changé au cas par cas avec `git clone --recurse-submodules` ou configuré de façon permanente avec "submodule.recurse", "fetch.recurseSubmodules" et "submodule.<name>.fetchRecurseSubmodules"
*# Lors d’un push, il faut pousser aussi les repos enfants
*#: Cela peut être changé au cas par cas avec `git push --recurse-submodules=check|on-demand|no` configuré de façon permanente avec "submodule.recurse" et "push.recurseSubmodules"
*# La compression est donc dégradée par rapport à un object store global
*# La perfomance lors d’un clone est dégradée par rapport à un clone global
* En cas de changement de branche (pour un repo ayant un work tree) :
** il y a des avertissements si les branches source et destination ont des repos enfants ayant des statuts "enregistré dans un commit"/"non-enregistré dans un commit" différents (dans le 2e cas, ça peut être un dossier "non suivi" ou "ignoré")
** il faut synchroniser a posteriori les repos enfants : si on oublie, on est alors dans un état intermédiaire entre deux commits
* L’algorithme de fusion ne fusionne pas à l’intérieur des sous-modules
*: Il faut fusionner chacun des sous-modules puis, lors de la fusion du repo parent, résoudre le conflit de fusion en préférant les commits fusionnés des repos enfants
* Il n’y a pas d’ordre canonique dans le fichier .gitmodules
*: Les commandes `git submodule add` ajoutent à la fin du fichier les nouveaux sous-modules
*: En cas de fusion, même si deux fichiers .gitmodules sont sémantiquement identiques (mêmes sous-modules, mêmes paramètres pour chaque sous-module), il peut y avoir un conflit de fusion sur ce fichier
* Lors du checkout, la référence HEAD des sous-modules pointe vers un commit et non vers la branche indiquée dans le fichier .gitmodules
*: Il est moins aisé de mettre à jour en masse les sous-modules (par exemple dans MediaWiki, dans le principal dépôt d’extensions (Gerrit), les extensions MediaWiki sont dans des branches correspondant à la version majeure de MediaWiki (par exemple REL1_35 pour la branche majeure 1.35) : par défaut il n’est pas possible de faire un `git submodule foreach git fetch` ou `git iterate -- fetch` (programme complémentaire git-iterate)
* Le support des sous-modules évolue (en s’améliorant amha) mais certaines commandes ou options de configuration n’étaient pas disponibles à l’origine
*: Cela amoindrit la facilité d’utilisation pour les anciennes versions de Git
=== Monorepo ===
Méthode :
* Faire un repo Git « parent »
* Ajouter les repos Git « enfants » avec des `git clone` ou `git submodule add|init` dans des dossiers du repo parent
* Faire un `git add .` dans le repo parent
* Retirer les dossiers <enfant>/.git et <parent>/.git/modules
* Faire des `git commit` dans le parent
Avantages :
* L’ensemble des fichiers est toujours cohérent (pas d’état intermédiaire comparé aux sous-modules, par exemple lorsqu’on change de branche sans faire un `git submodule update`)
* Un `git clone` télécharge l’ensemble des fichiers
Inconvénients :
* Les historiques d’origine des enfants sont perdus
*: Les liens avec les repos enfants étant perdus, ces dossiers vont évoluer de façon différente du repo "officiel", créant de facto des forks
=== Monorepo avec des repos enfants via des espaces de noms et remote-ext ===
Méthode :
* dans les repos enfants, créer des remote de type 'ext' pointant vers des namespaces refs/namespaces/gitmodules/refs/<enfant> dans le repo parent, faire un `git fetch` [à détailler]
* dans le repo parent, ajouter des .git/objects/info/alternates pour qu’il n’y ait pas de transferts physiques entre les objectstore enfant et l’objectstore parent
* ajouter de la glue pour que quand on commit dans un repo enfant, ça commit aussi le monorepo (possible?)
Inconvénients :
* Les remote de type 'ext' ne sont pas autorisés par défaut (voir git-remote-ext(1) et git-config(1) protocol.allow)
863b9f5753820153f3a75a7ebe3e8c824981d6c1
658127
658123
2021-07-31T21:46:32Z
Seb35
1
wikitext
text/x-wiki
Cette page est une étude pour trouver la meilleure solution de faire un monorepo Git, ou plus exactement, idéalement, un repo Git qui serait à la fois :
* un monorepo (qu’on puisse télécharger en une seule fois)
* un multi-repo où certains dossiers serait des repo Git ayant leur historique autonome.
Dans les contraintes imposées, il faut :
* que les solutions potentielles soient possibles en l’état actuel de Git ou, a maximum, un programme Bourne shell d’une taille relativement faible (afin d’être compatible sur un maximum de plate-formes et qu’il reste lisible et compréhensible),
* il peut y avoir une forme d’équivalence entre deux états "monorepo" et "multirepo" évenutuellement disticts mais switchable avec une commande,
* les commandes standard Git devraient fonctionner, au moins dans un certain état "monorepo"/"multirepo" s’ils sont distincts,
* la performance doit rester acceptable <small>(je sais, c’est vague et ça dépend des situations)</small>.
== Cas d’usage ==
Les cas d’usage que je prévoie sont :
* pour Archéo Lex : pouvoir aggréger l’ensemble des lois françaises dans un seul monorepo (au niveau stockage) mais en ayant la possibilité de télécharger seulement des sous-ensembles, par exemples les décrets,
* pour MediaWiki : pouvoir avoir le logiciel de base (un repo) avec les extensions (chacun dans un repo) où le déploiement est un monorepo comportant la version de base + les extensions déployées dans une certaine version, éventuellement patchée.
== Briques de base ==
Sous-modules Git (voir gitsubmodules(7))
''alternates'' (voir gitrepository-layout(5))
Espaces de noms Git (voir gitnamespaces(7))
Dépôt distant de type ''ext'' (voir git-remote-ext(1))
Ilôts delta ''(delta islands)'' (voir git-pack-objects(1))
Les options de configuration, par exemple "diff.submodule"
== Briques de solution ==
=== Plusieurs repos indépendants ===
Ceci n’est pas une solution au problème exposé car il n’y a jamais de monorepo, au sens que la version globale et unifiée d’un repo et de ses sous-repos n’est jamais présente. C’est toutefois une partie d’une éventuelle solution, intégrée à une autre brique de solution.
Méthode :
* Faire un repo Git « parent »
* Ajouter les repos Git « enfants » avec des `git clone` dans des dossiers du repo parent
* Faire des `git commit` dans chacun des enfants et du parent
…
=== Sous-modules classiques ===
Méthode :
* Faire un repo Git « parent »
* Ajouter les repos Git « enfants »
*# Ajouter les sous-modules avec `git submodule add|init|update`
*# Ajouter un repo Git normal dans un dossier, puis, dans le repo parent, faire un git-add(1) (il y a un avertissement, c’est normal), puis git-submodule(1) (absorbgitdirs) sur ce dossier pour transférer le dossier <enfant>/.git dans <parent>/.git/modules/<enfant>
* `git commit` dans le repo parent pour enregistrer la version
* `git submodule deinit` pour retirer le sous-module
Avantages :
* Très standard depuis longtemps, au moins pour l’organisation et les commandes de base
* Gestion de la récursion (enfants d’enfants)
* En local, tout l’historique est dans le dossier <parent>/.git
Inconvénients :
* Les repo enfants ne font pas partie du repo parent :
*# En cas d’accès distant, il faut rendre les repos enfants accessibles
*# En cas de clone du repo parent, seul le repo parent est téléchargé par défaut
*#: Cela peut être changé au cas par cas avec `git clone --recurse-submodules` ou configuré de façon permanente avec "submodule.recurse", "fetch.recurseSubmodules" et "submodule.<name>.fetchRecurseSubmodules"
*# Lors d’un push, il faut pousser aussi les repos enfants
*#: Cela peut être changé au cas par cas avec `git push --recurse-submodules=check|on-demand|no` configuré de façon permanente avec "submodule.recurse" et "push.recurseSubmodules"
*# La compression est donc dégradée par rapport à un object store global
*# La perfomance lors d’un clone est dégradée par rapport à un clone global
* En cas de changement de branche (pour un repo ayant un work tree) :
** il y a des avertissements si les branches source et destination ont des repos enfants ayant des statuts "enregistré dans un commit"/"non-enregistré dans un commit" différents (dans le 2e cas, ça peut être un dossier "non suivi" ou "ignoré")
** il faut synchroniser a posteriori les repos enfants : si on oublie, on est alors dans un état intermédiaire entre deux commits
* L’algorithme de fusion ne fusionne pas à l’intérieur des sous-modules
*: Il faut fusionner chacun des sous-modules puis, lors de la fusion du repo parent, résoudre le conflit de fusion en préférant les commits fusionnés des repos enfants
* Il n’y a pas d’ordre canonique dans le fichier .gitmodules
*: Les commandes `git submodule add` ajoutent à la fin du fichier les nouveaux sous-modules
*: En cas de fusion, même si deux fichiers .gitmodules sont sémantiquement identiques (mêmes sous-modules, mêmes paramètres pour chaque sous-module), il peut y avoir un conflit de fusion sur ce fichier
* Lors du checkout, la référence HEAD des sous-modules pointe vers un commit et non vers la branche indiquée dans le fichier .gitmodules
*: Il est moins aisé de mettre à jour en masse les sous-modules (par exemple dans MediaWiki, dans le principal dépôt d’extensions (Gerrit), les extensions MediaWiki sont dans des branches correspondant à la version majeure de MediaWiki (par exemple REL1_35 pour la branche majeure 1.35) : par défaut il n’est pas possible de faire un `git submodule foreach git fetch` ou `git iterate -- fetch` (programme complémentaire git-iterate)
* Le support des sous-modules évolue (en s’améliorant amha) mais certaines commandes ou options de configuration n’étaient pas disponibles à l’origine
*: Cela amoindrit la facilité d’utilisation pour les anciennes versions de Git
=== Monorepo ===
Méthode :
* Faire un repo Git « parent »
* Ajouter les repos Git « enfants » avec des `git clone` ou `git submodule add|init` dans des dossiers du repo parent
* Faire un `git add .` dans le repo parent
* Retirer les dossiers <enfant>/.git et <parent>/.git/modules
* Faire des `git commit` dans le parent
Avantages :
* L’ensemble des fichiers est toujours cohérent (pas d’état intermédiaire comparé aux sous-modules, par exemple lorsqu’on change de branche sans faire un `git submodule update`)
* Un `git clone` télécharge l’ensemble des fichiers
Inconvénients :
* Les historiques d’origine des enfants sont perdus
*: Les liens avec les repos enfants étant perdus, ces dossiers vont évoluer de façon différente du repo "officiel", créant de facto des forks
=== Monorepo avec des repos enfants via des espaces de noms et remote-ext ===
Méthode :
* dans les repos enfants, créer des remote de type 'ext' pointant vers des namespaces refs/namespaces/gitmodules/refs/<enfant> dans le repo parent, faire un `git fetch` [à détailler]
* dans le repo parent, ajouter des .git/objects/info/alternates pour qu’il n’y ait pas de transferts physiques entre les objectstore enfant et l’objectstore parent
* ajouter de la glue pour que quand on commit dans un repo enfant, ça commit aussi le monorepo (possible?)
Inconvénients :
* Les remote de type 'ext' ne sont pas autorisés par défaut (voir git-remote-ext(1) et git-config(1) protocol.allow)
=== Multi-repo stocké dans un monorepo ===
<syntaxhighlight lang="sh">
git init
git remote add <url> <dossier>
git branch <sousrepo1> …
git submodule add -b <sousrepo1> ./ <sousdossier1>
git commit
</syntaxhighlight>
Cela crée un sous-repo via un sous-module stocké dans une branche du monorepo, ce qui est une solution quasi-parfaite (dans ses grandes lignes) à mon sens :
* tout est stocké et téléchargé via le monorepo
* chaque sous-repo a un historique autonome (lié au repo parent par le numéro de commit comme classiquement avec les sous-modules)
Pour aller légèrement plus loin, j’aurais aimé qu’on puisse appeler, à la place d’une branche du repo parent, une référence du repo parent, mais ça ne semble pas possible [https://git-scm.com/docs/git-clone/fr] (cela éviterait que la commande classique "git branch" n’affiche par défaut les "sous-repo").
2f833c9719e44faaec87e97287ca79a88ae2cc64
PrivateBin
0
198
658124
2021-07-31T17:53:22Z
Seb35
1
doc d’installation
wikitext
text/x-wiki
Doc sysadmin de [https://github.com/PrivateBin/PrivateBin PrivateBin] (pastebin avec données chiffrées côté client et stockées sur le serveur).
Je l’avais installé pour test sur mon domaine https://privatebin.seb35.fr mais ne l’utilisant pas, je le désinstalle. Cette doc devrait permettre une éventuelle réinstallation (sur Debian avec nginx + PHP).
<syntaxhighlight lang="sh">
git clone https://github.com/PrivateBin/PrivateBin.git /opt/privatebin
cd /opt/privatebin
chown -R root: .
chgrp -R www-data data
chmod -R g+w data
</syntaxhighlight>
; /etc/nginx/sites-enabled/privatebin.seb35.fr
<syntaxhighlight lang="text">
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name privatebin.seb35.fr;
root /opt/privatebin;
index index.php;
# TLS
ssl_certificate /etc/ssl/private/privatebin.pem;
ssl_certificate_key /etc/ssl/private/privatebin.key.pem;
add_header Strict-Transport-Security "max-age=622080000";
ssl_session_timeout 1h;
deny all;
location = / {
allow all;
include php7.0-fpm.conf;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_param SCRIPT_NAME /index.php;
}
location /css/ {
allow all;
try_files $uri =404;
}
location /img/ {
allow all;
try_files $uri =404;
}
location /i18n/ {
allow all;
try_files $uri =404;
}
location /js/ {
allow all;
try_files $uri =404;
}
location /browserconfig.xml {
allow all;
try_files $uri =404;
}
location /robots.txt {
allow all;
try_files $uri =404;
}
}
</syntaxhighlight>
dd76694ec5c9383d564c78dd2288d4a796c58188
658125
658124
2021-07-31T17:58:37Z
Seb35
1
wikitext
text/x-wiki
Doc sysadmin de [https://github.com/PrivateBin/PrivateBin PrivateBin] ([https://privatebin.info site officiel]) (pastebin avec données chiffrées côté client et stockées sur le serveur).
Je l’avais installé pour test sur mon domaine https://privatebin.seb35.fr mais ne l’utilisant pas, je le désinstalle. Cette doc devrait permettre une éventuelle réinstallation (sur Debian avec nginx + PHP).
<syntaxhighlight lang="sh">
git clone https://github.com/PrivateBin/PrivateBin.git /opt/privatebin
cd /opt/privatebin
chown -R root: .
chgrp -R www-data data
chmod -R g+w data
</syntaxhighlight>
; /etc/nginx/sites-enabled/privatebin.seb35.fr
<syntaxhighlight lang="text">
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name privatebin.seb35.fr;
root /opt/privatebin;
index index.php;
# TLS
ssl_certificate /etc/ssl/private/privatebin.pem;
ssl_certificate_key /etc/ssl/private/privatebin.key.pem;
add_header Strict-Transport-Security "max-age=622080000";
ssl_session_timeout 1h;
deny all;
location = / {
allow all;
include php7.0-fpm.conf;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_param SCRIPT_NAME /index.php;
}
location /css/ {
allow all;
try_files $uri =404;
}
location /img/ {
allow all;
try_files $uri =404;
}
location /i18n/ {
allow all;
try_files $uri =404;
}
location /js/ {
allow all;
try_files $uri =404;
}
location /browserconfig.xml {
allow all;
try_files $uri =404;
}
location /robots.txt {
allow all;
try_files $uri =404;
}
}
</syntaxhighlight>
004339ba7f7d286c50ef1bb24f686979dd2a8845
Archéo Lex/Repo Git
0
199
658128
2021-08-10T12:17:27Z
Seb35
1
Page créée avec « Cette page fait état de l’architecture du/des repos Git créés par Archéo Lex, eu égard des contraintes (performance, stockage) et des usages possibles. == Existant... »
wikitext
text/x-wiki
Cette page fait état de l’architecture du/des repos Git créés par Archéo Lex, eu égard des contraintes (performance, stockage) et des usages possibles.
== Existant ==
=== État des lieux ===
Actuellement, Archéo Lex crée un repo par texte et a trois variantes de repo (paramètre --organisation) :
* la principale est de placer tous le texte en Markdown dans un seul fichier texte ;
* la seconde est de placer le contenu des articles dans des fichiers autonomes, à plat dans le dossier principal ;
* la troisième est de créer des sous-dossiers par section/sous-section du texte et de placer le contenu des articles dans des fichiers dans cette arborescence.
Il y a 1 ou 2 références par texte :
* "texte" (ou "sections" ou "articles") : le texte en vigueur
* "texte-futur" (ou "sections-futur" ou "articles-futur") : le texte en vigueur future (=prévu à une date future, par exemple au 1er janvier de l’année prochaine)
=== Problèmes ===
==== Ordre de grandeur ====
Cette organisation est adaptée pour les codes étant donné leur faible nombre (≈108 dont ≈74 en vigueur) : il n’y a que 1 ou 2 références par repo, ce qui ne pose pas de problèmes de performances.
Il est possible de créer un repo "codes" comprenant tous les codes (ou tous les codes en vigueur selon ce qu’on veut exposer), ce qui ne fait que ≈200 références. Toutefois, si on cherche (et c’est le cas) à généraliser Archéo Lex aux lois (≈12600<ref group="problemes-sur-l-existant">12595 avec nature='LOI' dans la base JORF au 9 février 2019 via [https://github.com/Legilibre/legi.py/issues/33 cette PR]</ref> dont entre 2,7k et 12k en vigueur<ref group="problemes-sur-l-existant">Au 9 août 2021 dans la base LEGI : 2746 lois en vigueur, 500 abrogrés, peu avec des statuts autres, total de 3331 lois ; il manque donc au moins ≈7000 lois dans la base LEGI dont on ne connait pas le statut abrogation ou vigueur</ref>), il peut y avoir des problèmes de performances d’autant plus qu’on ajoute les décrets (50k décrets dans LEGI, 200k dans JORF<ref group="problemes-sur-l-existant">Au 9 août 2021 dans la base LEGI : 49129 décrets dont 38287 en vigueur, 8066 abrogés, 1238 périmés, quelques dizaines pour les autres statuts. Au 9 février 2019 dans la base JORF : 204051 décrets.</ref>) ou les arrêtés (70k dans LEGI, 600k dans JORF<ref group="problemes-sur-l-existant">Au 9 août 2021 dans la base LEGI : 69812 arrêtés dont 53051 en vigueur, 12328 abrogés, 2306 périmés, quelques dizaines ou centaines dans les autres statuts. Au 9 février 2019 dans la base JORF : 606909 arrêtés.</ref>).
<div style="border:1px solid gray; padding: 0 1em;">
'''Notes'''
<references group="problemes-sur-l-existant" />
</div>
==== Fichier des références packed-refs ====
Le problème de performance est en partie sur le ''fichier des références packed-refs'' lors de son écriture. Celui-ci est un fichier texte dont la 1ère colonne sont des SHA-1 (40 octets) et la 2e colonne sont les refs correspondantes (longueur variable, probablement autour de 30 octets puisque les références seraient nommées comme refs/lois/loi_2021-689/texte (28 caractères) ou refs/décrets/décret_2021-699/texte (36 caractères)) ; ce fichier est trié, la 2e colonne étant la clé (il y a donc une problématique de tri lors de l’écriture de ce fichier). Sa taille est donc environ 70 octets x (nombre de textes) = 14 Mo pour 200k décrets.
Cela reste gérable si on ne conserve pas les versions passées des références (on a que la base LEGI+JORF du jour), mais n’est plus gérable si on veut garder les références de chaque texte des bases LEGI+JORF pour chaque jour (par ex. refs/codes/code_civil/texte/markdown/20181019-200412/vigueur), ou alors il ne faut stocker que les quelques textes mis à jour (et avoir un mécanisme pour requêter la base LEGI de n’importe quel jour en allant chercher la plus récente référence du texte avant ce jour).
==== Protocole ''smart'' de Git ====
Lors d’un essai sur un gros repo git avec de nombreuses références, j’ai expérimenté un échange interminable où le client dit qu’il a telle et telle référence (have xxxx [https://git-scm.com/book/en/v2/Git-Internals-Transfer-Protocols]) (c’était il y a 1 ou 2 ans, je crois qu’il y a un nouveau mécanisme pour optimiser cette étape).
2789d41bdc0266cc141344f34834722d6b722cb5
658129
658128
2021-08-10T16:12:15Z
Seb35
1
wikitext
text/x-wiki
Cette page fait état de l’architecture du/des repos Git créés par Archéo Lex, eu égard des contraintes (performance, stockage) et des usages possibles.
Voir aussi [[Monorepo Git]].
NB :
* ''repo'' = repository = dépôt Git
* ''repos'' = pluriel de ''repo''
== Existant ==
=== État des lieux ===
Actuellement, Archéo Lex crée un repo par texte et a trois variantes de repo (paramètre --organisation) :
* la principale est de placer tous le texte en Markdown dans un seul fichier texte ;
* la seconde est de placer le contenu des articles dans des fichiers autonomes, à plat dans le dossier principal ;
* la troisième est de créer des sous-dossiers par section/sous-section du texte et de placer le contenu des articles dans des fichiers dans cette arborescence.
Il y a 1 ou 2 références par texte :
* "texte" (ou "sections" ou "articles") : le texte en vigueur
* "texte-futur" (ou "sections-futur" ou "articles-futur") : le texte en vigueur future (=prévu à une date future, par exemple au 1er janvier de l’année prochaine)
=== Problèmes ===
==== Ordre de grandeur ====
Cette organisation est adaptée pour les codes étant donné leur faible nombre (≈108 dont ≈74 en vigueur) : il n’y a que 1 ou 2 références par repo, ce qui ne pose pas de problèmes de performances.
Il est possible de créer un repo "codes" comprenant tous les codes (ou tous les codes en vigueur selon ce qu’on veut exposer), ce qui ne fait que ≈200 références. Toutefois, si on cherche (et c’est le cas) à généraliser Archéo Lex aux lois (≈12600<ref group="problemes-sur-l-existant">12595 avec nature='LOI' dans la base JORF au 9 février 2019 via [https://github.com/Legilibre/legi.py/issues/33 cette PR]</ref> dont entre 2,7k et 12k en vigueur<ref group="problemes-sur-l-existant">Au 9 août 2021 dans la base LEGI : 2746 lois en vigueur, 500 abrogrés, peu avec des statuts autres, total de 3331 lois ; il manque donc au moins ≈7000 lois dans la base LEGI dont on ne connait pas le statut abrogation ou vigueur</ref>), il peut y avoir des problèmes de performances d’autant plus qu’on ajoute les décrets (50k décrets dans LEGI, 200k dans JORF<ref group="problemes-sur-l-existant">Au 9 août 2021 dans la base LEGI : 49129 décrets dont 38287 en vigueur, 8066 abrogés, 1238 périmés, quelques dizaines pour les autres statuts. Au 9 février 2019 dans la base JORF : 204051 décrets.</ref>) ou les arrêtés (70k dans LEGI, 600k dans JORF<ref group="problemes-sur-l-existant">Au 9 août 2021 dans la base LEGI : 69812 arrêtés dont 53051 en vigueur, 12328 abrogés, 2306 périmés, quelques dizaines ou centaines dans les autres statuts. Au 9 février 2019 dans la base JORF : 606909 arrêtés.</ref>).
<div style="border:1px solid gray; padding: 0 1em;">
'''Notes'''
<references group="problemes-sur-l-existant" />
</div>
==== Fichier des références packed-refs ====
Le problème de performance est en partie sur le ''fichier des références packed-refs'' lors de son écriture. Celui-ci est un fichier texte dont la 1ère colonne sont des SHA-1 (40 octets) et la 2e colonne sont les refs correspondantes (longueur variable, probablement autour de 30 octets puisque les références seraient nommées comme refs/lois/loi_2021-689/texte (28 caractères) ou refs/décrets/décret_2021-699/texte (36 caractères)) ; ce fichier est trié, la 2e colonne étant la clé (il y a donc une problématique de tri lors de l’écriture de ce fichier). Sa taille est donc environ 70 octets x (nombre de textes) = 14 Mo pour 200k décrets.
Cela reste gérable en taille (mais ça commence à faire vraiment beaucoup en nombre de refs) si on ne conserve pas les versions passées des références (on a que la base LEGI+JORF du jour), mais n’est plus gérable si on veut garder les références de chaque texte des bases LEGI+JORF pour chaque jour (par ex. refs/codes/code_civil/texte/markdown/20181019-200412/vigueur), ou alors il ne faut stocker que les quelques textes mis à jour (et avoir un mécanisme pour requêter la base LEGI de n’importe quel jour en allant chercher la plus récente référence du texte avant ce jour).
Voir aussi [https://github.com/git/git/blob/master/Documentation/technical/reftable.txt reftable] en cours d’implémentation dans Git (2021), qui optimisera l’accès aux références : temps constant quel que soit le nombre de références au lieu du temps linéaire actuel + enregistrement incrémental au lieu de l’enregistrement global actuel. Les ordres de grandeur donnés dans la spec reftable est 31k refs pour rails et 866k refs pour android. Le stockage des reflogs est géré également selon le même mécanisme.
==== Protocole ''smart'' de Git ====
Lors d’un essai sur un gros repo git avec de nombreuses références, j’ai expérimenté un échange interminable où le client dit qu’il a telle et telle référence (have xxxx [https://git-scm.com/book/en/v2/Git-Internals-Transfer-Protocols]) (c’était il y a 1 ou 2 ans, je crois qu’il y a un nouveau mécanisme pour optimiser cette étape).
== Future architecture ==
=== v2 ===
1) Conserver les 3 organisations actuelles des fichiers ("texte", "sections", "articles"), cela est éprouvé même si on peut améliorer à la marge (par exemple : noms des fichiers lorsque ça dépasse 255 caractères en ajoutant un sommaire, etc.)
2) Utiliser les reflogs pour stocker l’historique du repo -- confirmer que ça serait suffisamment adapté, notamment :
# pour retrouver l’état d’une ref à une date passée,
# pour fixer la date de changement de la ref (fixer au jour d’entrée en vigueur minuit même si on exécute la commande à 22:50:25 la veille),
# optionnellement pour créer des packfiles "historiques" contenant les très anciennes versions des références
3) Continuer à servir publiquement des repos "codes/code_civil.git" et y ajouter "lois/loi_2021-689.git" et "décrets/décret_2021-699.git" : cela est utile pour SedLex quand on veut consolider un texte (par ex. un amendement qui modifie la version en vigueur du code civil). L’implémentation côté serveur reste à déterminer.
4) Servir publiquement des repos "lois.git", "décrets.git" contenant des sous-modules par année "lois/2020.git", "décrets/2020.git", liant vers les repos autonomes ci-dessus (pour le repo "codes.git" : directement les respos autonomes). Les mises à jour de ces repos seraient relativement rapides : seuls les sous-modules par année modifiée seraient mis à jour, et il y a actuellement dans LEGI 50 lois/an, 1500 décrets/an, 3000 arrêtés/an. Possiblement, dans une version intégrée, les sous-modules par année pourraient être des branches du repo parent afin de tout télécharger en même temps (et non télécharger à N+1 repos) ; j’ai testé récemment avec Git 2.30, c’est possible avec une URL de sous-module de la forme "./" (et il faut que l’objet commit du sous-module soit dans le repo courant, d’où la nécessité que ce soit dans une branche ou un tag).
La granularité "année" peut être changée en "mois" voire "jour" pour mettre par exemple les décrets datés du 21 juin 2020 dans le repo "décrets/2020/06/21.git" (noter que, vu le processus de consolidation, les sous-modules évolueront quelque soit la granularité vis-à-vis de leur date de publication). Plus la granularité est forte, moins chaque sous-module sera mis à jour (mais plus le téléchargement initial mettra de temps puisqu’il faudra télécharger plus de repos distincts). Un panachage du stockage peut être introduit : par exemple stockage des sous-modules par année dans le repo principal, puis téléchargement distant des sous-modules par mois.
Une version plus évoluée pourrait être que, pour une granularité "mois", les 3 derniers mois sont stockés dans des branches (donc téléchargés d’office initialement) et les plus anciens sont téléchargeables au cas par cas ; dans cette configuration, cela demande côté client de changer la configuration ".git/config" puisque les branches du mois vont disparaître du repo principal avec le temps et il faudra alors les télécharger explicitement.
Côté serveur, il serait possible d’utiliser les "gitnamespaces" [https://git-scm.com/docs/gitnamespaces] avec une certaine configuration nginx pour stocker efficacement ces repos dans un seul repo (ou 2 ou 3 par granularité, à tester vis-à-vis de la performance), et la performance devrait rester acceptable au moins jusqu’à une granularité du mois (250 ans x 12 mois + 250 sommaires = 3250 refs).
a9f507d9c0849df8f42440926fa2b85bf5e6c6aa
658130
658129
2021-08-10T17:30:32Z
Seb35
1
typo
wikitext
text/x-wiki
Cette page fait état de l’architecture du/des repos Git créés par Archéo Lex, eu égard des contraintes (performance, stockage) et des usages possibles.
Voir aussi [[Monorepo Git]].
NB :
* ''repo'' = repository = dépôt Git
* ''repos'' = pluriel de ''repo''
== Existant ==
=== État des lieux ===
Actuellement, Archéo Lex crée un repo par texte et a trois variantes de repo (paramètre --organisation) :
* la principale est de placer tous le texte en Markdown dans un seul fichier texte ;
* la seconde est de placer le contenu des articles dans des fichiers autonomes, à plat dans le dossier principal ;
* la troisième est de créer des sous-dossiers par section/sous-section du texte et de placer le contenu des articles dans des fichiers dans cette arborescence.
Il y a 1 ou 2 références par texte :
* "texte" (ou "sections" ou "articles") : le texte en vigueur
* "texte-futur" (ou "sections-futur" ou "articles-futur") : le texte en vigueur future (=prévu à une date future, par exemple au 1er janvier de l’année prochaine)
=== Problèmes ===
==== Ordre de grandeur ====
Cette organisation est adaptée pour les codes étant donné leur faible nombre (≈108 dont ≈74 en vigueur) : il n’y a que 1 ou 2 références par repo, ce qui ne pose pas de problèmes de performances.
Il est possible de créer un repo "codes" comprenant tous les codes (ou tous les codes en vigueur selon ce qu’on veut exposer), ce qui ne fait que ≈200 références. Toutefois, si on cherche (et c’est le cas) à généraliser Archéo Lex aux lois (≈12600<ref group="problemes-sur-l-existant">12595 avec nature='LOI' dans la base JORF au 9 février 2019 via [https://github.com/Legilibre/legi.py/issues/33 cette PR]</ref> dont entre 2,7k et 12k en vigueur<ref group="problemes-sur-l-existant">Au 9 août 2021 dans la base LEGI : 2746 lois en vigueur, 500 abrogrés, peu avec des statuts autres, total de 3331 lois ; il manque donc au moins ≈7000 lois dans la base LEGI dont on ne connait pas le statut abrogation ou vigueur</ref>), il peut y avoir des problèmes de performances d’autant plus qu’on ajoute les décrets (50k décrets dans LEGI, 200k dans JORF<ref group="problemes-sur-l-existant">Au 9 août 2021 dans la base LEGI : 49129 décrets dont 38287 en vigueur, 8066 abrogés, 1238 périmés, quelques dizaines pour les autres statuts. Au 9 février 2019 dans la base JORF : 204051 décrets.</ref>) ou les arrêtés (70k dans LEGI, 600k dans JORF<ref group="problemes-sur-l-existant">Au 9 août 2021 dans la base LEGI : 69812 arrêtés dont 53051 en vigueur, 12328 abrogés, 2306 périmés, quelques dizaines ou centaines dans les autres statuts. Au 9 février 2019 dans la base JORF : 606909 arrêtés.</ref>).
<div style="border:1px solid gray; padding: 0 1em;">
'''Notes'''
<references group="problemes-sur-l-existant" />
</div>
==== Fichier des références packed-refs ====
Le problème de performance est en partie sur le ''fichier des références packed-refs'' lors de son écriture. Celui-ci est un fichier texte dont la 1ère colonne sont des SHA-1 (40 octets) et la 2e colonne sont les refs correspondantes (longueur variable, probablement autour de 30 octets puisque les références seraient nommées comme refs/lois/loi_2021-689/texte (28 caractères) ou refs/décrets/décret_2021-699/texte (36 caractères)) ; ce fichier est trié, la 2e colonne étant la clé (il y a donc une problématique de tri lors de l’écriture de ce fichier). Sa taille est donc environ 70 octets x (nombre de textes) = 14 Mo pour 200k décrets.
Cela reste gérable en taille (mais ça commence à faire vraiment beaucoup en nombre de refs) si on ne conserve pas les versions passées des références (on a que la base LEGI+JORF du jour), mais n’est plus gérable si on veut garder les références de chaque texte des bases LEGI+JORF pour chaque jour (par ex. refs/codes/code_civil/texte/markdown/20181019-200412/vigueur), ou alors il ne faut stocker que les quelques textes mis à jour (et avoir un mécanisme pour requêter la base LEGI de n’importe quel jour en allant chercher la plus récente référence du texte avant ce jour).
Voir aussi [https://github.com/git/git/blob/master/Documentation/technical/reftable.txt reftable] en cours d’implémentation dans Git (2021), qui optimisera l’accès aux références : temps constant quel que soit le nombre de références au lieu du temps linéaire actuel + enregistrement incrémental au lieu de l’enregistrement global actuel. Les ordres de grandeur donnés dans la spec reftable est 31k refs pour rails et 866k refs pour android. Le stockage des reflogs est géré également selon le même mécanisme.
==== Protocole ''smart'' de Git ====
Lors d’un essai sur un gros repo git avec de nombreuses références, j’ai expérimenté un échange interminable où le client dit qu’il a telle et telle référence (have xxxx [https://git-scm.com/book/en/v2/Git-Internals-Transfer-Protocols]) (c’était il y a 1 ou 2 ans, je crois qu’il y a un nouveau mécanisme pour optimiser cette étape).
== Future architecture ==
=== v2 ===
1) Conserver les '''3 organisations actuelles des fichiers''' ("texte", "sections", "articles"), cela est éprouvé même si on peut améliorer à la marge (par exemple : noms des fichiers lorsque ça dépasse 255 caractères en ajoutant un sommaire, etc.). Sur la publication sur archeo-lex.fr, je pense publier uniquement l’organisation "texte" qui ne souffre pas de limitations sur le nommage des articles et est plus éprouvée jusqu’à présent.
2) '''Utiliser les reflogs pour stocker l’historique du repo''' -- confirmer que ça serait suffisamment adapté, notamment :
# pour retrouver l’état d’une ref à une date passée,
# pour fixer la date de changement de la ref (fixer au jour d’entrée en vigueur minuit même si on exécute la commande à 22:50:25 la veille),
# optionnellement pour créer des packfiles "historiques" contenant les très anciennes versions des références
3) Continuer à '''servir publiquement des repos "codes/code_civil.git" et y ajouter "lois/loi_2021-689.git" et "décrets/décret_2021-699.git"''' : cela est utile pour SedLex quand on veut consolider un texte (par ex. un amendement qui modifie la version en vigueur du code civil). L’implémentation côté serveur reste à déterminer.
4) Servir '''publiquement des repos "lois.git" et "décrets.git"''' contenant des sous-modules par année "lois/2020.git", "décrets/2020.git", liant vers les repos autonomes ci-dessus (pour le repo "codes.git" : directement les respos autonomes). Les mises à jour de ces repos seraient relativement rapides : seuls les sous-modules par année modifiée seraient mis à jour, et il y a actuellement dans LEGI 50 lois/an, 1500 décrets/an, 3000 arrêtés/an. Possiblement, dans une version intégrée, les sous-modules par année pourraient être des branches du repo parent afin de tout télécharger en même temps (et non télécharger à N+1 repos) ; j’ai testé récemment avec Git 2.30, c’est possible avec une URL de sous-module de la forme "./" (et il faut que l’objet commit du sous-module soit dans le repo courant, d’où la nécessité que ce soit dans une branche ou un tag).
La granularité "année" peut être changée en "mois" voire "jour" pour mettre par exemple les décrets datés du 21 juin 2020 dans le repo "décrets/2020/06/21.git" (noter que, vu le processus de consolidation, les sous-modules évolueront quelque soit la granularité vis-à-vis de leur date de publication). Plus la granularité est forte, moins chaque sous-module sera mis à jour (mais plus le téléchargement initial mettra de temps puisqu’il faudra télécharger plus de repos distincts). Un panachage du stockage peut être introduit : par exemple stockage des sous-modules par année dans le repo principal, puis téléchargement distant des sous-modules par mois.
Une version plus évoluée pourrait être que, pour une granularité "mois", les 3 derniers mois sont stockés dans des branches (donc téléchargés d’office initialement) et les plus anciens sont téléchargeables au cas par cas ; dans cette configuration, cela demande côté client de changer la configuration ".git/config" puisque les branches du mois vont disparaître du repo principal avec le temps et il faudra alors les télécharger explicitement.
Côté serveur, il serait possible d’utiliser les "gitnamespaces" [https://git-scm.com/docs/gitnamespaces] avec une certaine configuration nginx pour stocker efficacement ces repos dans un seul repo (ou 2 ou 3 par granularité, à tester vis-à-vis de la performance), et la performance devrait rester acceptable au moins jusqu’à une granularité du mois (250 ans x 12 mois + 250 sommaires = 3250 refs).
5a65994e863a522774be32483f4de8e4510038fe
658131
658130
2021-08-10T17:34:09Z
Seb35
1
wikitext
text/x-wiki
Cette page fait état de l’architecture du/des repos Git créés par Archéo Lex, eu égard des contraintes (performance, stockage) et des usages possibles.
Voir aussi [[Monorepo Git]].
NB :
* ''repo'' = repository = dépôt Git
* ''repos'' = pluriel de ''repo''
== Existant ==
=== État des lieux ===
Actuellement, Archéo Lex crée un repo par texte et a trois variantes de repo (paramètre --organisation) :
* la principale est de placer tous le texte en Markdown dans un seul fichier texte ;
* la seconde est de placer le contenu des articles dans des fichiers autonomes, à plat dans le dossier principal ;
* la troisième est de créer des sous-dossiers par section/sous-section du texte et de placer le contenu des articles dans des fichiers dans cette arborescence.
Il y a 1 ou 2 références par texte :
* "texte" (ou "sections" ou "articles") : le texte en vigueur
* "texte-futur" (ou "sections-futur" ou "articles-futur") : le texte en vigueur future (=prévu à une date future, par exemple au 1er janvier de l’année prochaine)
=== Problèmes ===
==== Ordre de grandeur ====
Cette organisation est adaptée pour les codes étant donné leur faible nombre (≈108 dont ≈74 en vigueur) : il n’y a que 1 ou 2 références par repo, ce qui ne pose pas de problèmes de performances.
Il est possible de créer un repo "codes" comprenant tous les codes (ou tous les codes en vigueur selon ce qu’on veut exposer), ce qui ne fait que ≈200 références. Toutefois, si on cherche (et c’est le cas) à généraliser Archéo Lex aux lois (≈12600<ref group="problemes-sur-l-existant">12595 avec nature='LOI' dans la base JORF au 9 février 2019 via [https://github.com/Legilibre/legi.py/issues/33 cette PR]</ref> dont entre 2,7k et 12k en vigueur<ref group="problemes-sur-l-existant">Au 9 août 2021 dans la base LEGI : 2746 lois en vigueur, 500 abrogrés, peu avec des statuts autres, total de 3331 lois ; il manque donc au moins ≈7000 lois dans la base LEGI dont on ne connait pas le statut abrogation ou vigueur</ref>), il peut y avoir des problèmes de performances d’autant plus qu’on ajoute les décrets (50k décrets dans LEGI, 200k dans JORF<ref group="problemes-sur-l-existant">Au 9 août 2021 dans la base LEGI : 49129 décrets dont 38287 en vigueur, 8066 abrogés, 1238 périmés, quelques dizaines pour les autres statuts. Au 9 février 2019 dans la base JORF : 204051 décrets.</ref>) ou les arrêtés (70k dans LEGI, 600k dans JORF<ref group="problemes-sur-l-existant">Au 9 août 2021 dans la base LEGI : 69812 arrêtés dont 53051 en vigueur, 12328 abrogés, 2306 périmés, quelques dizaines ou centaines dans les autres statuts. Au 9 février 2019 dans la base JORF : 606909 arrêtés.</ref>).
<div style="border:1px solid gray; padding: 0 1em;">
'''Notes'''
<references group="problemes-sur-l-existant" />
</div>
==== Fichier des références packed-refs ====
Le problème de performance est en partie sur le ''fichier des références packed-refs'' lors de son écriture. Celui-ci est un fichier texte dont la 1ère colonne sont des SHA-1 (40 octets) et la 2e colonne sont les refs correspondantes (longueur variable, probablement autour de 30 octets puisque les références seraient nommées comme refs/lois/loi_2021-689/texte (28 caractères) ou refs/décrets/décret_2021-699/texte (36 caractères)) ; ce fichier est trié, la 2e colonne étant la clé (il y a donc une problématique de tri lors de l’écriture de ce fichier). Sa taille est donc environ 70 octets x (nombre de textes) = 14 Mo pour 200k décrets.
Cela reste gérable en taille (mais ça commence à faire vraiment beaucoup en nombre de refs) si on ne conserve pas les versions passées des références (on a que la base LEGI+JORF du jour), mais n’est plus gérable si on veut garder les références de chaque texte des bases LEGI+JORF pour chaque jour (par ex. refs/codes/code_civil/texte/markdown/20181019-200412/vigueur), ou alors il ne faut stocker que les quelques textes mis à jour (et avoir un mécanisme pour requêter la base LEGI de n’importe quel jour en allant chercher la plus récente référence du texte avant ce jour).
Voir aussi [https://github.com/git/git/blob/master/Documentation/technical/reftable.txt reftable] en cours d’implémentation dans Git (2021), qui optimisera l’accès aux références : temps constant quel que soit le nombre de références au lieu du temps linéaire actuel + enregistrement incrémental au lieu de l’enregistrement global actuel. Les ordres de grandeur donnés dans la spec reftable est 31k refs pour rails et 866k refs pour android. Le stockage des reflogs est géré également selon le même mécanisme.
==== Protocole ''smart'' de Git ====
Lors d’un essai sur un gros repo git avec de nombreuses références, j’ai expérimenté un échange interminable où le client dit qu’il a telle et telle référence (have xxxx [https://git-scm.com/book/en/v2/Git-Internals-Transfer-Protocols]) (c’était il y a 1 ou 2 ans, je crois qu’il y a un nouveau mécanisme pour optimiser cette étape).
== Future architecture ==
=== v2 ===
1) Conserver les '''3 organisations actuelles des fichiers''' ("texte", "sections", "articles"), cela est éprouvé même si on peut améliorer à la marge (par exemple : noms des fichiers lorsque ça dépasse 255 caractères en ajoutant un sommaire, etc.). Sur la publication sur archeo-lex.fr, je pense publier uniquement l’organisation "texte" qui ne souffre pas de limitations sur le nommage des articles et est plus éprouvée jusqu’à présent.
2) Conserver les '''2 noms de branches relatifs à la vigueur du texte''' ("texte" et "texte-futur", etc pour les autres organisations des fichiers), cela est éprouvé et permet de savoir quasi-immédiatement le statut de vigueur du texte (la seule ambiguité est si le texte est abrogé : il y a une branche "texte" ne contenant aucun fichier).
3) '''Utiliser les reflogs pour stocker l’historique du repo''' -- confirmer que ça serait suffisamment adapté, notamment :
# pour retrouver l’état d’une ref à une date passée,
# pour fixer la date de changement de la ref (fixer au jour d’entrée en vigueur minuit même si on exécute la commande à 22:50:25 la veille),
# optionnellement pour créer des packfiles "historiques" contenant les très anciennes versions des références
4) Continuer à '''servir publiquement des repos "codes/code_civil.git" et y ajouter "lois/loi_2021-689.git" et "décrets/décret_2021-699.git"''' : cela est utile pour SedLex quand on veut consolider un texte (par ex. un amendement qui modifie la version en vigueur du code civil). L’implémentation côté serveur reste à déterminer.
5) Servir '''publiquement des repos "lois.git" et "décrets.git"''' contenant des sous-modules par année "lois/2020.git", "décrets/2020.git", liant vers les repos autonomes ci-dessus (pour le repo "codes.git" : directement les respos autonomes). Les mises à jour de ces repos seraient relativement rapides : seuls les sous-modules par année modifiée seraient mis à jour, et il y a actuellement dans LEGI 50 lois/an, 1500 décrets/an, 3000 arrêtés/an. Possiblement, dans une version intégrée, les sous-modules par année pourraient être des branches du repo parent afin de tout télécharger en même temps (et non télécharger à N+1 repos) ; j’ai testé récemment avec Git 2.30, c’est possible avec une URL de sous-module de la forme "./" (et il faut que l’objet commit du sous-module soit dans le repo courant, d’où la nécessité que ce soit dans une branche ou un tag).
La granularité "année" peut être changée en "mois" voire "jour" pour mettre par exemple les décrets datés du 21 juin 2020 dans le repo "décrets/2020/06/21.git" (noter que, vu le processus de consolidation, les sous-modules évolueront quelque soit la granularité vis-à-vis de leur date de publication). Plus la granularité est forte, moins chaque sous-module sera mis à jour (mais plus le téléchargement initial mettra de temps puisqu’il faudra télécharger plus de repos distincts). Un panachage du stockage peut être introduit : par exemple stockage des sous-modules par année dans le repo principal, puis téléchargement distant des sous-modules par mois.
Une version plus évoluée pourrait être que, pour une granularité "mois", les 3 derniers mois sont stockés dans des branches (donc téléchargés d’office initialement) et les plus anciens sont téléchargeables au cas par cas ; dans cette configuration, cela demande côté client de changer la configuration ".git/config" puisque les branches du mois vont disparaître du repo principal avec le temps et il faudra alors les télécharger explicitement.
Côté serveur, il serait possible d’utiliser les "gitnamespaces" [https://git-scm.com/docs/gitnamespaces] avec une certaine configuration nginx pour stocker efficacement ces repos dans un seul repo (ou 2 ou 3 par granularité, à tester vis-à-vis de la performance), et la performance devrait rester acceptable au moins jusqu’à une granularité du mois (250 ans x 12 mois + 250 sommaires = 3250 refs).
d435f69090cd59b7770c7fac7f87cc2aa62e1a4c
Tutorial:Beautiful MediaWiki URLs
102
178
658132
4236
2021-08-26T21:39:34Z
Seb35
1
A retiré la protection de « [[Tutorial:Beautiful MediaWiki URLs]] »
wikitext
text/x-wiki
{{Tutorial|lang=en|status=stable}}
This page is about configurating beautiful and pure URLs for MediaWiki, basically without any visible "index.php". For example:
<div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;">
:[{{SERVER}}/{{FULLPAGENAMEE}}?action=edit http://{{SERVERNAME}}/{{FULLPAGENAMEE}}?action=edit]
''instead of''
:[{{SERVER}}/index.php?title={{FULLPAGENAMEE}}&action=edit http://{{SERVERNAME}}/index.php?title={{FULLPAGENAMEE}}&action=edit]
</div>
and it is even better in languages with non-latin alphabets:
<div style="border: 1px dotted black; margin-left: 2em; padding: 0.5em;">
:[{{SERVER}}/维基百科?action=history http://{{SERVERNAME}}/维基百科?action=history]
''instead of''
:[{{SERVER}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history http://{{SERVERNAME}}/index.php?title=%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91&action=history]
</div>
== Rationale and introduction ==
The reasoning behind this is: The syntax "index.php" is not interesting from the user’s point of view so it shouldn’t be there; additionally the user should (want) to see understandable page names instead of %-encoded nonsense.
You can see on this wiki these rules in action. Technically, these ugly URLs come from good’ ol’ time’ of [[:enwikipedia:Common Gateway Interface|CGI scripts]] (ten years ago), but now —and since some time— it is possible to rewrite URLs on the server, added to the fact that all recent browsers display URLs with characters instead of %-encoded URLs, but still not in the parameters of the URL after the "?". So it’s time to remove this "index.php".
To reconciliate MediaWiki URLs with recent browsers, we take advantage of the "path info" capability offered by servers (here nginx) and we configure MediaWiki such that it vastly limit the rendering of ugly URLs.
== Prerequisites ==
* [https://www.mediawiki.org MediaWiki], installed in the directory, say, '/var/www/mediawiki'
* [http://nginx.com nginx], preferably with the module Lua (package nginx-extras in Debian/Ubuntu)
* The wiki is assumed to be installed on "<nowiki>http://wiki.example.org/</nowiki>"
* The server must support the PATH_INFO directive; it is the case for most "nginx + PHP gateway" but you should really check it works before continuing, see [https://www.mediawiki.org/Special:MyLanguage/Manual:$wgUsePathInfo Manual:$wgUsePathInfo] on MediaWiki.org.
== MediaWiki configuration ==
It is assumed the wiki is directly served from the server root location instead of a subdirectory (e.g. <nowiki>"https://example.org/" instead of "https://example.org/tools/mywiki/"</nowiki>). In other words, the "root" directive in the nginx server is the directory itself where is installed MediaWiki (where index.php is).
The following configuration variables must be added at the end of the file LocalSettings.php, in MediaWiki directory.
1. Remove the "script path" to remove all web-visible subdirectories. This should be done accordingly with nginx configuration, or it could break the installed website.
$wgScriptPath = <nowiki>''</nowiki>;
2. Set the article path to its simplest form. With this, links leading to the 'view' action of the pages will be beautiful, instead of using "index.php". The server should support the "path info" capability —it’s the case of nginx.
$wgArticlePath = '/$1';
3. Now, true improvements begin. When you view an article, the URL is beautiful, but it becomes again ugly when you edit an article or ask its printable form. So let’s remove the "index.php".
$wgScript = <nowiki>''</nowiki>;
4. The links for the actions now have the form "/Main_Page?title=Main_Page&action=edit" for the edit action. There is still the "title=" parameter which should be removed since it is already displayed in the main part of the URL. To achieve that, we have to add a small hook in LocalSettings.php to remove the "title=" parameter.
$wgHooks['GetLocalURL::Internal'][] = 'phpAgnosticURL';
function phpAgnosticURL( $title, &$url, $query ) {
global $wgArticlePath;
$url = str_replace( '$1', wfUrlencode( $title->getPrefixedDBkey() ), $wgArticlePath );
while ( preg_match( '/^(.*&|)title=([^&]*)(&.*|)$/', $query, $matches ) ) {
$query = $matches[1] . $matches[3];
}
if ( $query != <nowiki>''</nowiki> ) {
$url = wfAppendQuery( $url, $query );
}
}
Basically, MediaWiki now generates beautiful URLs but nginx no more understand the URLs where there is no "title=" parameter. In the next part, we will retablish the functioning, we will completely hide the PHP system files (this improves security), and by the way permit the creation of page with almost all possible titles (e.g. you will be able to create the page "Index.php" on the wiki; it is probably useless^^, but perhaps you can be interested by titles "Skins/…").
== Nginx configuration ==
5. The basic skeleton is just below. 'location' directives will be added in the following.
server {
listen 80;
listen 443 ssl;
server_name wiki.example.org;
root /var/www/mediawiki;
# 'location' directives to be added thereafter
}
6. First, let’s add simple things: backend PHP scripts. We don’t search to hide them, they are backend so not viewed by human users, but machines must have access to these scripts.
location ~ ^/(api|load|opensearch_desc)\.php$ {
include php5-fpm.conf;
}
7. Next, the more important thing: the call to the hidden "index.php" to catch all actions and transmit them to MediaWiki. This use the PATH_INFO parameter of CGI scripts. Additionally, we add an exception for the situation where there is still a parameter "title="; it’s the case in MediaWiki forms (Special:Recentchanges, Special:Log, etc.) and it will make the whole system both backward-compatible and with beautiful URLs (a permanent redirect from the old URLs to the new URLs). The Lua rewriting part was done thanks to an [http://forum.nginx.org/read.php?2,243462,243464 agentzh’s message] (thanks!).
location / {
if ($arg_title != <nowiki>''</nowiki>) {
set_by_lua $mwredirect '
local args = ngx.var.args
local arg_title = ngx.var.arg_title
arg_title = ngx.re.gsub(arg_title, "%3A", ":")
arg_title = ngx.re.gsub(arg_title, "%20", "_")
arg_title = ngx.re.gsub(arg_title, "[+]", "_")
local url = "/" .. arg_title
newargs, n, err = ngx.re.gsub(args, [[\btitle=[^&]*&?]], "", "jo")
if string.len(newargs) > 0 then
url = url .. "?" ..newargs
end
if string.sub(url, -1) == "&" then
url = string.sub(url, 1, -2)
end
return url
';
return 301 $mwredirect;
}
include php5-fpm.conf;
fastcgi_split_path_info ^(/)(.*)$;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
8. Now, you should have a quite functional wiki, apart some missing images. Let’s add the UI images from the /skins subdirectory and the /extensions subdirectory at the same time (some extensions have JavaScript files or image files in their directories). Here are only allowed: the images, the JS files, the CSS and LESS files, and the .htc files (used by IE).
location ~ ^/(extensions|skins)/ {
location ~ \.(js|css|htc|less|png|svg|gif|jpg|xcf)$ {
allow all;
try_files $uri =403;
}
deny all;
}
9. Now we can allow integrated files of the /images subdirectory. Below are two variants depending if your wiki is public or private.
location ~ ^/images/ {
# Publicly accessible files
location ~ ^/images/(\.htaccess|README|lockdir.*)$ {
return 404;
}
location ~ /$ {
deny all;
}
try_files $uri =404;
# Private files for a private wiki
#include php5-fpm.conf;
#fastcgi_split_path_info ^(/images/)(.*)$;
#fastcgi_param SCRIPT_FILENAME $document_root/img_auth.php;
#fastcgi_param PATH_INFO $fastcgi_path_info;
}
10. To finish, we can add /robots.txt and /favicon.ico.
location ~ ^/(robots.txt|favicon.ico)$ {
try_files $uri =404;
}
== Complements ==
a. If you cannot install the Lua module in nginx, directly-entered old URLs (coming from external places like emails, other websites, user bookmarks, etc.) will work but will be displayed as old URLs ("/index.php?title=Main_Page&action=edit"). Once the user click on some link on the wiki, s/he will see new URLs.
b. To avoid MediaWiki to create URLs with remaining "title=" parameters, MediaWiki core should be patched in many places: in all forms where there is a <nowiki><input type="hidden" name="title" … /></nowiki> HTML tag and possibly in other places. Possibly some bug should be created, at least to give an option to natively create beautiful URLs.
c. MediaWiki update maintenance: nothing from the MediaWiki configuration side, apart if you modify MediaWiki core (it is not recommanded to facilitate updates). Probably the changed configuration parameters will stay backward-compatible for some long time since most were introduced in pre 1.1.0 MediaWiki versions. Possibly some PHP scripts must be added in the point 6 in future MediaWiki releases, see the entry points in your Special:Version page or on [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org. Possibly you can want to change the files enumerated in point 9 (this list is better from a security point of view, but this requires maintenance over time).
d. The nginx configuration above was done with strict security considerations in order to remove all entry points to system files, but this requires maintenance over time. You can want to soften these security checks:
# add more PHP scripts in point 6, see [https://www.mediawiki.org/wiki/Manual:Code#Access_points Manual:Code#Access points] on MediaWiki.org
# add more media files extensions in point 8, or even acess all files in the "extensions" and "skins" subdirectories, or at the contrary blacklist some file extensions (e.g. mainly .php files)
# remove the list of files in point 9, this is probably harmless from a security point of view
e. The list in point 10 could be changed depending of specific needs. For example, you could change the location of the favicon (see [https://www.mediawiki.org/wiki/Manual:$wgFavicon $wgFavicon]), or you can add a file /sitemap.xml, etc. Additionally some MediaWiki extensions or core features propose to manage some "metadata system files" like /robots.txt or /sitemap.xml; if you want to use these features, you could have to create other "location" in nginx configuration with some wrapper to PHP file, similarly to the wrapper for "/images/" in the case of a private wiki.
f. As of MediaWiki 1.23, the entry points on the page Special:Version will show "[ ]" for "index.php", this can be considered a ''bug'': the case where "index.php" is completely removed is not expected :)
g. An easier way to remove most of the index.php is to use [[:mw:Manual:$wgActionPaths|$wgActionPaths]]. With this configuration setting, the 'edit' action on this page would be <tt>[{{SERVER}}/edit/{{FULLPAGENAMEE}} http://{{SERVERNAME}}/edit/{{FULLPAGENAMEE}}]</tt> instead of <tt>[{{SERVER}}/{{FULLPAGENAMEE}}?action=edit http://{{SERVERNAME}}/{{FULLPAGENAMEE}}?action=edit]</tt>. I have no opinion on what is better. It can be kept in mind that some browsers might remove the address part after the "?"; in these browsers, the action would or would not be displayed. Note : how does MediaWiki react with $wgActionPaths when there are (e.g.) "action=edit" and "section=0": is it "/edit/Title?section=0" or "/index.php?title=Title&action=edit§ion=0"?
== Conclusion ==
# Now the URLs are "/Main_Page", "/Main_Page?action=history", "/Main_Page?printable=yes", etc.
# Non-latin alphabets benefit of the "real characters" rendering of the browser in the URL
# The system is backward-compatible with existing URLs, and old URLs are rewritten if you have installed the Lua part in the nginx configuration.
# Your articles can have a wide range of titles and are not limited by system files, e.g. you can write articles about "Robots.txt", "Images", "Skins", or "Index.php" (NB: the initial capital).
# Except whitelisted system files and subdirectories, nobody can access to the underlying system files: e.g. "includes/Title.php" is considered as an article, as well as "LocalSettings.php", hence an attacker does not have a direct access to the system files and s/he will have to deal with MediaWiki before attacking PHP files.
03570137c0bdf1de0f81eeba154fcb9ac854b005
Contributions
0
200
658137
2023-05-21T19:25:23Z
Seb35
1
Contributions au logiciel libre et idées, Ajout d’une idée de contribution sur nginx
wikitext
text/x-wiki
J’expose sur cette page mes contributions en cours ou à venir à des logiciels libres (ou autres domaines de la culture libre).
== Idées ==
=== 2023-05-21 - nginx - utilisation plus exhaustive du code 405 Method Not Allowed ===
En parcourant des logs d’un serveur nginx et observant les attaquants opportunistes, je remarque que les méthodes HTTP exotiques ne sont pas rejetées avec le code "405 Method Not Allowed". Par exemple la configuration <code>try_files $uri =404;</code> donne :
* requête = "DELETE /fichier-inexistant.pdf HTTP/1.1" réponse = "404 Not Found" car le fichier n’existe pas
* requête = "DELETE /fichier-existant.pdf HTTP/1.1" réponse = "405 Not Allowed"
Il serait intéressant qu’il y ait un paramètre de configuration <code>methods_allowed GET HEAD POST;</code> par exemple pour '''refuser inconditionnellement des méthodes''' exotiques pour le serveur en question afin de ''limiter encore plus la surface d’attaque''.
La [https://datatracker.ietf.org/doc/html/rfc2068#section-5.1.1 RFC 2068 section 5.1.1 Method] dit que l’implémentation des méthodes GET et HEAD est obligatoire, toutes les autres sont optionnelles et ''peuvent'' changer dynamiquement.
Il y a déjà dans le code de nginx des retours "405 Not Allowed" selon les modules (par exemple [https://trac.nginx.org/nginx/browser/nginx/src/http/modules/ngx_http_static_module.c ngx_http_static_module.c] retourne 405 si la méthode n’est pas GET, HEAD ou POST ; ou [https://trac.nginx.org/nginx/browser/nginx/src/http/modules/ngx_http_empty_gif_module.c ngx_http_empty_gif_module.c] retourn 405 si la méthode n’est pas GET ou HEAD), mais il serait préférable que ça retourne toujours 405 si aucun module n’est en capacité de répondre (ou laisser à l’administrateur la possibilité de faire cette liste dans la conf).
PS : je ne suis pas complètement sûr que la fonctionnalité n’existe pas déjà, il est possible que mon observation vienne du fait que Debian compile nginx avec --with-http_dav_module, et peut-être que le verbe DELETE pourrait ''potentiellement'' répondre même si on a explicitement ou implicitement [https://nginx.org/en/docs/http/ngx_http_dav_module.html#dav_methods <code>dav_methods off;</code>] dans le contexte.
Actions à faire :
# Compiler nginx sans aucun module
# Re-tester
# Confirmer ou non le problème
# Éventuellement investiguer comment ça se comporte si on active le module dav
f0048525ad687dcdb6f53516768ea49e592986d0
658138
658137
2023-05-21T19:27:39Z
Seb35
1
Précision
wikitext
text/x-wiki
J’expose sur cette page mes contributions en cours ou à venir à des logiciels libres (ou autres domaines de la culture libre).
== Idées ==
=== 2023-05-21 - nginx - utilisation plus exhaustive du code 405 Method Not Allowed ===
En parcourant des logs d’un serveur nginx et observant les attaquants opportunistes, je remarque que les méthodes HTTP exotiques ne sont pas rejetées avec le code "405 Method Not Allowed". Par exemple la configuration <code>try_files $uri =404;</code> donne :
* requête = "DELETE /fichier-inexistant.pdf HTTP/1.1" réponse = "404 Not Found" car le fichier n’existe pas
* requête = "DELETE /fichier-existant.pdf HTTP/1.1" réponse = "405 Not Allowed"
Il serait intéressant qu’il y ait un paramètre de configuration <code>methods_allowed GET HEAD POST;</code> par exemple pour '''refuser inconditionnellement des méthodes''' exotiques pour le serveur en question afin de ''limiter encore plus la surface d’attaque''.
La [https://datatracker.ietf.org/doc/html/rfc2068#section-5.1.1 RFC 2068 section 5.1.1 Method] dit que l’implémentation des méthodes GET et HEAD est obligatoire, toutes les autres sont optionnelles et ''peuvent'' changer dynamiquement.
Il y a déjà dans le code de nginx des retours "405 Not Allowed" selon les modules (chercher la constante NGX_HTTP_NOT_ALLOWED, par exemple [https://trac.nginx.org/nginx/browser/nginx/src/http/modules/ngx_http_static_module.c ngx_http_static_module.c] retourne 405 si la méthode n’est pas GET, HEAD ou POST ; ou [https://trac.nginx.org/nginx/browser/nginx/src/http/modules/ngx_http_empty_gif_module.c ngx_http_empty_gif_module.c] retourn 405 si la méthode n’est pas GET ou HEAD), mais il serait préférable que ça retourne toujours 405 si aucun module n’est en capacité de répondre (ou laisser à l’administrateur la possibilité de faire cette liste dans la conf).
PS : je ne suis pas complètement sûr que la fonctionnalité n’existe pas déjà, il est possible que mon observation vienne du fait que Debian compile nginx avec --with-http_dav_module, et peut-être que le verbe DELETE pourrait ''potentiellement'' répondre même si on a explicitement ou implicitement [https://nginx.org/en/docs/http/ngx_http_dav_module.html#dav_methods <code>dav_methods off;</code>] dans le contexte.
Actions à faire :
# Compiler nginx sans aucun module
# Re-tester
# Confirmer ou non le problème
# Éventuellement investiguer comment ça se comporte si on active le module dav
9a2c8cc91408260eb99a4bebf3da92caa97590c1
658139
658138
2023-05-21T20:10:04Z
Seb35
1
+idée « 2023-05-21 - nginx + RFC 9110 - utilisation trop fréquente du code 505 HTTP Version Not Supported »
wikitext
text/x-wiki
J’expose sur cette page mes contributions en cours ou à venir à des logiciels libres (ou autres domaines de la culture libre).
== Idées ==
=== 2023-05-21 - nginx + RFC 9110 - utilisation trop fréquente du code 505 HTTP Version Not Supported ===
En parcourant des logs d’un serveur nginx, je constate des requêtes <code>GET / HTTP/7.9</code> [https://mamot.fr/@Seb35/110406323127847264], alors que, en 2023, la version la fréquente de HTTP est 2.0 et la 3.0 vient d’être publiée (juin 2022) : mettre une version de HTTP égale à 7.9 n’est donc pas une erreur du client mais est une sonde en phase de reconnaissance (soit du fuzzing, soit ciblant un logiciel précis). L’occurence de telles requêtes semble très rare toutefois.
Utiliser un code 5xx laisse à penser que c’est un problème du serveur, hors le serveur ne peut pas implémenter une version de HTTP qui n’existe pas (encore), c’est donc une erreur du client. Ce raisonnement touche au standard [https://datatracker.ietf.org/doc/html/rfc9110#section-15.6.6 RFC 9110 section 15.6.6] plus qu’à nginx.
Pour les '''sysadmins qui observent les logs et particulièrement les erreurs 5xx''' (qui sont des problèmes soit dans les implémentations (à corriger) soit opérationnels (performance notamment)), '''ça oblige à avoir un traitement fin''' : est-ce que la version HTTP existe (client peut-être légitime) ou n’existe pas (attaque obligatoirement) ?
Du côté de '''nginx''', je serais d’avis de '''retourner une erreur 400''' (à défaut d’un meilleur code 4xx), soit avec une liste fixée dans le code disant les versions potentiellement acceptées à l’époque (actuellement ça serait erreur 400 pou HTTP > 3.0 et erreur 505 pour HTTP <= 3.0 s’il n’y a pas de module pour HTTP 3.0 puisqu’il ''pourrait'' y en avoir puisque le standard est disponible). Pour laisser plus de flexibilité, il pourrait être créé un paramètre dans la configuration pour permettre aux sysadmins de changer la version maximum existante sans avoir à changer la version de nginx tout de suite. Ce paramètre pourrait être abusé par les sysadmins qui ne voudraient pas avoir de codes 5xx même si une nouvelle version de HTTP devient disponible et que des clients peuvent alors commencer à la demander.
=== 2023-05-21 - nginx - utilisation plus exhaustive du code 405 Method Not Allowed ===
En parcourant des logs d’un serveur nginx et observant les attaquants opportunistes, je remarque que les méthodes HTTP exotiques ne sont pas rejetées avec le code "405 Method Not Allowed". Par exemple la configuration <code>try_files $uri =404;</code> donne :
* requête = "DELETE /fichier-inexistant.pdf HTTP/1.1" réponse = "404 Not Found" car le fichier n’existe pas
* requête = "DELETE /fichier-existant.pdf HTTP/1.1" réponse = "405 Not Allowed"
Il serait intéressant qu’il y ait un paramètre de configuration <code>methods_allowed GET HEAD POST;</code> par exemple pour '''refuser inconditionnellement des méthodes''' exotiques pour le serveur en question afin de ''limiter encore plus la surface d’attaque''.
La [https://datatracker.ietf.org/doc/html/rfc9110#section-9.1 RFC 9110 section 9.1 Method > Overview] dit que l’implémentation des méthodes GET et HEAD est obligatoire, toutes les autres sont optionnelles et ''peuvent'' changer dynamiquement.
Il y a déjà dans le code de nginx des retours "405 Not Allowed" selon les modules (chercher la constante NGX_HTTP_NOT_ALLOWED, par exemple [https://trac.nginx.org/nginx/browser/nginx/src/http/modules/ngx_http_static_module.c ngx_http_static_module.c] retourne 405 si la méthode n’est pas GET, HEAD ou POST ; ou [https://trac.nginx.org/nginx/browser/nginx/src/http/modules/ngx_http_empty_gif_module.c ngx_http_empty_gif_module.c] retourn 405 si la méthode n’est pas GET ou HEAD), mais il serait préférable que ça retourne toujours 405 si aucun module n’est en capacité de répondre (ou laisser à l’administrateur la possibilité de faire cette liste dans la conf).
PS : je ne suis pas complètement sûr que la fonctionnalité n’existe pas déjà, il est possible que mon observation vienne du fait que Debian compile nginx avec --with-http_dav_module, et peut-être que le verbe DELETE pourrait ''potentiellement'' répondre même si on a explicitement ou implicitement [https://nginx.org/en/docs/http/ngx_http_dav_module.html#dav_methods <code>dav_methods off;</code>] dans le contexte.
Actions à faire :
# Compiler nginx sans aucun module
# Re-tester
# Confirmer ou non le problème
# Éventuellement investiguer comment ça se comporte si on active le module dav
e4f4ed43bccd16ed14069dc056e7d8f9c34863a9
658140
658139
2023-05-21T20:32:19Z
Seb35
1
/* 2023-05-21 - nginx - utilisation plus exhaustive du code 405 Method Not Allowed */ +1 point dans la liste d’actions à faire
wikitext
text/x-wiki
J’expose sur cette page mes contributions en cours ou à venir à des logiciels libres (ou autres domaines de la culture libre).
== Idées ==
=== 2023-05-21 - nginx + RFC 9110 - utilisation trop fréquente du code 505 HTTP Version Not Supported ===
En parcourant des logs d’un serveur nginx, je constate des requêtes <code>GET / HTTP/7.9</code> [https://mamot.fr/@Seb35/110406323127847264], alors que, en 2023, la version la fréquente de HTTP est 2.0 et la 3.0 vient d’être publiée (juin 2022) : mettre une version de HTTP égale à 7.9 n’est donc pas une erreur du client mais est une sonde en phase de reconnaissance (soit du fuzzing, soit ciblant un logiciel précis). L’occurence de telles requêtes semble très rare toutefois.
Utiliser un code 5xx laisse à penser que c’est un problème du serveur, hors le serveur ne peut pas implémenter une version de HTTP qui n’existe pas (encore), c’est donc une erreur du client. Ce raisonnement touche au standard [https://datatracker.ietf.org/doc/html/rfc9110#section-15.6.6 RFC 9110 section 15.6.6] plus qu’à nginx.
Pour les '''sysadmins qui observent les logs et particulièrement les erreurs 5xx''' (qui sont des problèmes soit dans les implémentations (à corriger) soit opérationnels (performance notamment)), '''ça oblige à avoir un traitement fin''' : est-ce que la version HTTP existe (client peut-être légitime) ou n’existe pas (attaque obligatoirement) ?
Du côté de '''nginx''', je serais d’avis de '''retourner une erreur 400''' (à défaut d’un meilleur code 4xx), soit avec une liste fixée dans le code disant les versions potentiellement acceptées à l’époque (actuellement ça serait erreur 400 pou HTTP > 3.0 et erreur 505 pour HTTP <= 3.0 s’il n’y a pas de module pour HTTP 3.0 puisqu’il ''pourrait'' y en avoir puisque le standard est disponible). Pour laisser plus de flexibilité, il pourrait être créé un paramètre dans la configuration pour permettre aux sysadmins de changer la version maximum existante sans avoir à changer la version de nginx tout de suite. Ce paramètre pourrait être abusé par les sysadmins qui ne voudraient pas avoir de codes 5xx même si une nouvelle version de HTTP devient disponible et que des clients peuvent alors commencer à la demander.
=== 2023-05-21 - nginx - utilisation plus exhaustive du code 405 Method Not Allowed ===
En parcourant des logs d’un serveur nginx et observant les attaquants opportunistes, je remarque que les méthodes HTTP exotiques ne sont pas rejetées avec le code "405 Method Not Allowed". Par exemple la configuration <code>try_files $uri =404;</code> donne :
* requête = "DELETE /fichier-inexistant.pdf HTTP/1.1" réponse = "404 Not Found" car le fichier n’existe pas
* requête = "DELETE /fichier-existant.pdf HTTP/1.1" réponse = "405 Not Allowed"
Il serait intéressant qu’il y ait un paramètre de configuration <code>methods_allowed GET HEAD POST;</code> par exemple pour '''refuser inconditionnellement des méthodes''' exotiques pour le serveur en question afin de ''limiter encore plus la surface d’attaque''.
La [https://datatracker.ietf.org/doc/html/rfc9110#section-9.1 RFC 9110 section 9.1 Method > Overview] dit que l’implémentation des méthodes GET et HEAD est obligatoire, toutes les autres sont optionnelles et ''peuvent'' changer dynamiquement.
Il y a déjà dans le code de nginx des retours "405 Not Allowed" selon les modules (chercher la constante NGX_HTTP_NOT_ALLOWED, par exemple [https://trac.nginx.org/nginx/browser/nginx/src/http/modules/ngx_http_static_module.c ngx_http_static_module.c] retourne 405 si la méthode n’est pas GET, HEAD ou POST ; ou [https://trac.nginx.org/nginx/browser/nginx/src/http/modules/ngx_http_empty_gif_module.c ngx_http_empty_gif_module.c] retourn 405 si la méthode n’est pas GET ou HEAD), mais il serait préférable que ça retourne toujours 405 si aucun module n’est en capacité de répondre (ou laisser à l’administrateur la possibilité de faire cette liste dans la conf).
PS : je ne suis pas complètement sûr que la fonctionnalité n’existe pas déjà, il est possible que mon observation vienne du fait que Debian compile nginx avec --with-http_dav_module, et peut-être que le verbe DELETE pourrait ''potentiellement'' répondre même si on a explicitement ou implicitement [https://nginx.org/en/docs/http/ngx_http_dav_module.html#dav_methods <code>dav_methods off;</code>] dans le contexte.
Actions à faire :
# Compiler nginx sans aucun module
# Parcourir https://nginx.org/en/docs/dev/development_guide.html
# Re-tester
# Confirmer ou non le problème
# Éventuellement investiguer comment ça se comporte si on active le module dav
03feb5aca1f69f87f5303fa7a68ed4bb4cc91977
658141
658140
2023-05-21T22:29:31Z
Seb35
1
+Logiciel flus.io
wikitext
text/x-wiki
J’expose sur cette page mes contributions en cours ou à venir à des logiciels libres (ou autres domaines de la culture libre).
== Logiciels ==
=== flus.io ===
[https://github.com/flusio/flusio/issues/594 Issue #594 - Items en double] ouverte le 2023-05-19 - à suivre, éventuellement chercher à résoudre
== Idées ==
=== 2023-05-21 - nginx + RFC 9110 - utilisation trop fréquente du code 505 HTTP Version Not Supported ===
En parcourant des logs d’un serveur nginx, je constate des requêtes <code>GET / HTTP/7.9</code> [https://mamot.fr/@Seb35/110406323127847264], alors que, en 2023, la version la fréquente de HTTP est 2.0 et la 3.0 vient d’être publiée (juin 2022) : mettre une version de HTTP égale à 7.9 n’est donc pas une erreur du client mais est une sonde en phase de reconnaissance (soit du fuzzing, soit ciblant un logiciel précis). L’occurence de telles requêtes semble très rare toutefois.
Utiliser un code 5xx laisse à penser que c’est un problème du serveur, hors le serveur ne peut pas implémenter une version de HTTP qui n’existe pas (encore), c’est donc une erreur du client. Ce raisonnement touche au standard [https://datatracker.ietf.org/doc/html/rfc9110#section-15.6.6 RFC 9110 section 15.6.6] plus qu’à nginx.
Pour les '''sysadmins qui observent les logs et particulièrement les erreurs 5xx''' (qui sont des problèmes soit dans les implémentations (à corriger) soit opérationnels (performance notamment)), '''ça oblige à avoir un traitement fin''' : est-ce que la version HTTP existe (client peut-être légitime) ou n’existe pas (attaque obligatoirement) ?
Du côté de '''nginx''', je serais d’avis de '''retourner une erreur 400''' (à défaut d’un meilleur code 4xx), soit avec une liste fixée dans le code disant les versions potentiellement acceptées à l’époque (actuellement ça serait erreur 400 pou HTTP > 3.0 et erreur 505 pour HTTP <= 3.0 s’il n’y a pas de module pour HTTP 3.0 puisqu’il ''pourrait'' y en avoir puisque le standard est disponible). Pour laisser plus de flexibilité, il pourrait être créé un paramètre dans la configuration pour permettre aux sysadmins de changer la version maximum existante sans avoir à changer la version de nginx tout de suite. Ce paramètre pourrait être abusé par les sysadmins qui ne voudraient pas avoir de codes 5xx même si une nouvelle version de HTTP devient disponible et que des clients peuvent alors commencer à la demander.
=== 2023-05-21 - nginx - utilisation plus exhaustive du code 405 Method Not Allowed ===
En parcourant des logs d’un serveur nginx et observant les attaquants opportunistes, je remarque que les méthodes HTTP exotiques ne sont pas rejetées avec le code "405 Method Not Allowed". Par exemple la configuration <code>try_files $uri =404;</code> donne :
* requête = "DELETE /fichier-inexistant.pdf HTTP/1.1" réponse = "404 Not Found" car le fichier n’existe pas
* requête = "DELETE /fichier-existant.pdf HTTP/1.1" réponse = "405 Not Allowed"
Il serait intéressant qu’il y ait un paramètre de configuration <code>methods_allowed GET HEAD POST;</code> par exemple pour '''refuser inconditionnellement des méthodes''' exotiques pour le serveur en question afin de ''limiter encore plus la surface d’attaque''.
La [https://datatracker.ietf.org/doc/html/rfc9110#section-9.1 RFC 9110 section 9.1 Method > Overview] dit que l’implémentation des méthodes GET et HEAD est obligatoire, toutes les autres sont optionnelles et ''peuvent'' changer dynamiquement.
Il y a déjà dans le code de nginx des retours "405 Not Allowed" selon les modules (chercher la constante NGX_HTTP_NOT_ALLOWED, par exemple [https://trac.nginx.org/nginx/browser/nginx/src/http/modules/ngx_http_static_module.c ngx_http_static_module.c] retourne 405 si la méthode n’est pas GET, HEAD ou POST ; ou [https://trac.nginx.org/nginx/browser/nginx/src/http/modules/ngx_http_empty_gif_module.c ngx_http_empty_gif_module.c] retourn 405 si la méthode n’est pas GET ou HEAD), mais il serait préférable que ça retourne toujours 405 si aucun module n’est en capacité de répondre (ou laisser à l’administrateur la possibilité de faire cette liste dans la conf).
PS : je ne suis pas complètement sûr que la fonctionnalité n’existe pas déjà, il est possible que mon observation vienne du fait que Debian compile nginx avec --with-http_dav_module, et peut-être que le verbe DELETE pourrait ''potentiellement'' répondre même si on a explicitement ou implicitement [https://nginx.org/en/docs/http/ngx_http_dav_module.html#dav_methods <code>dav_methods off;</code>] dans le contexte.
Actions à faire :
# Compiler nginx sans aucun module
# Parcourir https://nginx.org/en/docs/dev/development_guide.html
# Re-tester
# Confirmer ou non le problème
# Éventuellement investiguer comment ça se comporte si on active le module dav
67a8e32b8ea4a1d7381fd0182624c2dce3780073
658142
658141
2023-05-22T10:48:54Z
Seb35
1
/* Logiciels */ +PdfParser
wikitext
text/x-wiki
J’expose sur cette page mes contributions en cours ou à venir à des logiciels libres (ou autres domaines de la culture libre).
== Logiciels ==
=== PdfParser ===
[https://github.com/smalot/pdfparser/pull/600 Pull Request #600 - Fix ASCII85 decoding in a specific case] - proposé le 2023-05-02 - '''TODO 2023-05-22 : ajouter un test'''
=== flus.io ===
[https://github.com/flusio/flusio/issues/594 Issue #594 - Items en double] ouverte le 2023-05-19 - à suivre, éventuellement chercher à résoudre
== Idées ==
=== 2023-05-21 - nginx + RFC 9110 - utilisation trop fréquente du code 505 HTTP Version Not Supported ===
En parcourant des logs d’un serveur nginx, je constate des requêtes <code>GET / HTTP/7.9</code> [https://mamot.fr/@Seb35/110406323127847264], alors que, en 2023, la version la fréquente de HTTP est 2.0 et la 3.0 vient d’être publiée (juin 2022) : mettre une version de HTTP égale à 7.9 n’est donc pas une erreur du client mais est une sonde en phase de reconnaissance (soit du fuzzing, soit ciblant un logiciel précis). L’occurence de telles requêtes semble très rare toutefois.
Utiliser un code 5xx laisse à penser que c’est un problème du serveur, hors le serveur ne peut pas implémenter une version de HTTP qui n’existe pas (encore), c’est donc une erreur du client. Ce raisonnement touche au standard [https://datatracker.ietf.org/doc/html/rfc9110#section-15.6.6 RFC 9110 section 15.6.6] plus qu’à nginx.
Pour les '''sysadmins qui observent les logs et particulièrement les erreurs 5xx''' (qui sont des problèmes soit dans les implémentations (à corriger) soit opérationnels (performance notamment)), '''ça oblige à avoir un traitement fin''' : est-ce que la version HTTP existe (client peut-être légitime) ou n’existe pas (attaque obligatoirement) ?
Du côté de '''nginx''', je serais d’avis de '''retourner une erreur 400''' (à défaut d’un meilleur code 4xx), soit avec une liste fixée dans le code disant les versions potentiellement acceptées à l’époque (actuellement ça serait erreur 400 pou HTTP > 3.0 et erreur 505 pour HTTP <= 3.0 s’il n’y a pas de module pour HTTP 3.0 puisqu’il ''pourrait'' y en avoir puisque le standard est disponible). Pour laisser plus de flexibilité, il pourrait être créé un paramètre dans la configuration pour permettre aux sysadmins de changer la version maximum existante sans avoir à changer la version de nginx tout de suite. Ce paramètre pourrait être abusé par les sysadmins qui ne voudraient pas avoir de codes 5xx même si une nouvelle version de HTTP devient disponible et que des clients peuvent alors commencer à la demander.
=== 2023-05-21 - nginx - utilisation plus exhaustive du code 405 Method Not Allowed ===
En parcourant des logs d’un serveur nginx et observant les attaquants opportunistes, je remarque que les méthodes HTTP exotiques ne sont pas rejetées avec le code "405 Method Not Allowed". Par exemple la configuration <code>try_files $uri =404;</code> donne :
* requête = "DELETE /fichier-inexistant.pdf HTTP/1.1" réponse = "404 Not Found" car le fichier n’existe pas
* requête = "DELETE /fichier-existant.pdf HTTP/1.1" réponse = "405 Not Allowed"
Il serait intéressant qu’il y ait un paramètre de configuration <code>methods_allowed GET HEAD POST;</code> par exemple pour '''refuser inconditionnellement des méthodes''' exotiques pour le serveur en question afin de ''limiter encore plus la surface d’attaque''.
La [https://datatracker.ietf.org/doc/html/rfc9110#section-9.1 RFC 9110 section 9.1 Method > Overview] dit que l’implémentation des méthodes GET et HEAD est obligatoire, toutes les autres sont optionnelles et ''peuvent'' changer dynamiquement.
Il y a déjà dans le code de nginx des retours "405 Not Allowed" selon les modules (chercher la constante NGX_HTTP_NOT_ALLOWED, par exemple [https://trac.nginx.org/nginx/browser/nginx/src/http/modules/ngx_http_static_module.c ngx_http_static_module.c] retourne 405 si la méthode n’est pas GET, HEAD ou POST ; ou [https://trac.nginx.org/nginx/browser/nginx/src/http/modules/ngx_http_empty_gif_module.c ngx_http_empty_gif_module.c] retourn 405 si la méthode n’est pas GET ou HEAD), mais il serait préférable que ça retourne toujours 405 si aucun module n’est en capacité de répondre (ou laisser à l’administrateur la possibilité de faire cette liste dans la conf).
PS : je ne suis pas complètement sûr que la fonctionnalité n’existe pas déjà, il est possible que mon observation vienne du fait que Debian compile nginx avec --with-http_dav_module, et peut-être que le verbe DELETE pourrait ''potentiellement'' répondre même si on a explicitement ou implicitement [https://nginx.org/en/docs/http/ngx_http_dav_module.html#dav_methods <code>dav_methods off;</code>] dans le contexte.
Actions à faire :
# Compiler nginx sans aucun module
# Parcourir https://nginx.org/en/docs/dev/development_guide.html
# Re-tester
# Confirmer ou non le problème
# Éventuellement investiguer comment ça se comporte si on active le module dav
f1647c57d521870e8dd134d7cfe4532b1a753646
658143
658142
2023-05-23T13:14:12Z
Seb35
1
update pour l’erreur 405 de nginx
wikitext
text/x-wiki
J’expose sur cette page mes contributions en cours ou à venir à des logiciels libres (ou autres domaines de la culture libre).
== Logiciels ==
=== PdfParser ===
[https://github.com/smalot/pdfparser/pull/600 Pull Request #600 - Fix ASCII85 decoding in a specific case] - proposé le 2023-05-02 - '''TODO 2023-05-22 : ajouter un test'''
=== flus.io ===
[https://github.com/flusio/flusio/issues/594 Issue #594 - Items en double] ouverte le 2023-05-19 - à suivre, éventuellement chercher à résoudre
== Idées ==
=== 2023-05-21 - nginx + RFC 9110 - utilisation trop fréquente du code 505 HTTP Version Not Supported ===
En parcourant des logs d’un serveur nginx, je constate des requêtes <code>GET / HTTP/7.9</code> [https://mamot.fr/@Seb35/110406323127847264], alors que, en 2023, la version la fréquente de HTTP est 2.0 et la 3.0 vient d’être publiée (juin 2022) : mettre une version de HTTP égale à 7.9 n’est donc pas une erreur du client mais est une sonde en phase de reconnaissance (soit du fuzzing, soit ciblant un logiciel précis). L’occurence de telles requêtes semble très rare toutefois.
Utiliser un code 5xx laisse à penser que c’est un problème du serveur, hors le serveur ne peut pas implémenter une version de HTTP qui n’existe pas (encore), c’est donc une erreur du client. Ce raisonnement touche au standard [https://datatracker.ietf.org/doc/html/rfc9110#section-15.6.6 RFC 9110 section 15.6.6] plus qu’à nginx.
Pour les '''sysadmins qui observent les logs et particulièrement les erreurs 5xx''' (qui sont des problèmes soit dans les implémentations (à corriger) soit opérationnels (performance notamment)), '''ça oblige à avoir un traitement fin''' : est-ce que la version HTTP existe (client peut-être légitime) ou n’existe pas (attaque obligatoirement) ?
Du côté de '''nginx''', je serais d’avis de '''retourner une erreur 400''' (à défaut d’un meilleur code 4xx), soit avec une liste fixée dans le code disant les versions potentiellement acceptées à l’époque (actuellement ça serait erreur 400 pou HTTP > 3.0 et erreur 505 pour HTTP <= 3.0 s’il n’y a pas de module pour HTTP 3.0 puisqu’il ''pourrait'' y en avoir puisque le standard est disponible). Pour laisser plus de flexibilité, il pourrait être créé un paramètre dans la configuration pour permettre aux sysadmins de changer la version maximum existante sans avoir à changer la version de nginx tout de suite. Ce paramètre pourrait être abusé par les sysadmins qui ne voudraient pas avoir de codes 5xx même si une nouvelle version de HTTP devient disponible et que des clients peuvent alors commencer à la demander.
=== 2023-05-21 - nginx - utilisation plus exhaustive du code 405 Method Not Allowed ===
En parcourant des logs d’un serveur nginx et observant les attaquants opportunistes, je remarque que les méthodes HTTP exotiques ne sont pas rejetées avec le code "405 Method Not Allowed". Par exemple la configuration <code>try_files $uri =404;</code> donne :
* requête = "DELETE /fichier-inexistant.pdf HTTP/1.1" réponse = "404 Not Found" car le fichier n’existe pas
* requête = "DELETE /fichier-existant.pdf HTTP/1.1" réponse = "405 Not Allowed"
Il serait intéressant qu’il y ait un paramètre de configuration <code>methods_allowed GET HEAD POST;</code> par exemple pour '''refuser inconditionnellement des méthodes''' exotiques pour le serveur en question afin de ''limiter encore plus la surface d’attaque''.
La [https://datatracker.ietf.org/doc/html/rfc9110#section-9.1 RFC 9110 section 9.1 Method > Overview] dit que l’implémentation des méthodes GET et HEAD est obligatoire, toutes les autres sont optionnelles et ''peuvent'' changer dynamiquement.
Il y a déjà dans le code de nginx des retours "405 Not Allowed" selon les modules (chercher la constante NGX_HTTP_NOT_ALLOWED, par exemple [https://trac.nginx.org/nginx/browser/nginx/src/http/modules/ngx_http_static_module.c ngx_http_static_module.c] retourne 405 si la méthode n’est pas GET, HEAD ou POST ; ou [https://trac.nginx.org/nginx/browser/nginx/src/http/modules/ngx_http_empty_gif_module.c ngx_http_empty_gif_module.c] retourn 405 si la méthode n’est pas GET ou HEAD), mais il serait préférable que ça retourne toujours 405 si aucun module n’est en capacité de répondre (ou laisser à l’administrateur la possibilité de faire cette liste dans la conf).
PS : je ne suis pas complètement sûr que la fonctionnalité n’existe pas déjà, il est possible que mon observation vienne du fait que Debian compile nginx avec --with-http_dav_module, et peut-être que le verbe DELETE pourrait ''potentiellement'' répondre même si on a explicitement ou implicitement [https://nginx.org/en/docs/http/ngx_http_dav_module.html#dav_methods <code>dav_methods off;</code>] dans le contexte.
==== Actions à faire ====
# <s>Compiler nginx sans aucun module</s>
# Parcourir https://nginx.org/en/docs/dev/development_guide.html
# <s>Re-tester</s>
# <s>Confirmer ou non le problème</s>
# <s>Éventuellement investiguer comment ça se comporte si on active le module dav</s>
# Par rapport au problème que j’observe (en nginx 1.14 de Debian buster), soit les nouvelles versions de nginx ont corrigé le problème, soit c’est un des modules non-encore-testé qui introduit le problème (dans les modules officiels image_filter, geoip, perl ; ou dans les modules supplémentaires auth-pam, dav-ext, echo, upstream-fair, subs-filter)
==== Compilation ====
Avec nginx 1.23.0 bddd3f76e3e5 (2023-05-23T00:45:18+04:00)
<code>./auto/configure --with-cc-opt='-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/tmp/nginx/usr/share/nginx --conf-path=/tmp/nginx/etc/nginx/nginx.conf --http-log-path=/tmp/nginx/var/log/nginx/access.log --error-log-path=/tmp/nginx/var/log/nginx/error.log --lock-path=/tmp/nginx/var/lock/nginx.lock --pid-path=/tmp/nginx/run/nginx.pid --modules-path=/tmp/nginx/usr/lib/nginx/modules --http-client-body-temp-path=/tmp/nginx/var/lib/nginx/body --http-fastcgi-temp-path=/tmp/nginx/var/lib/nginx/fastcgi --http-proxy-temp-path=/tmp/nginx/var/lib/nginx/proxy --http-scgi-temp-path=/tmp/nginx/var/lib/nginx/scgi --http-uwsgi-temp-path=/tmp/nginx/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-threads --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-http_addition_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_secure_link_module --with-http_sub_module --with-http_xslt_module</code>
Il n’y a pas le problème : <code>curl -v -X DELETE 'http://127.0.0.1:8080/fichier-existant.txt'</code> et <code>curl -v -X DELETE 'http://127.0.0.1:8080/fichier-inexistant.txt'</code> retournent 405 Not Allowed (et le module dav est innocent).
9a20adf8448b2ae907f255f8095f750c48b41222
658144
658143
2023-05-23T18:33:49Z
Seb35
1
le problème identifié sur nginx code 405 a probablement été corrigé dans les versions récentes
wikitext
text/x-wiki
J’expose sur cette page mes contributions en cours ou à venir à des logiciels libres (ou autres domaines de la culture libre).
== Logiciels ==
=== PdfParser ===
[https://github.com/smalot/pdfparser/pull/600 Pull Request #600 - Fix ASCII85 decoding in a specific case] - proposé le 2023-05-02 - '''TODO 2023-05-22 : ajouter un test'''
=== flus.io ===
[https://github.com/flusio/flusio/issues/594 Issue #594 - Items en double] ouverte le 2023-05-19 - à suivre, éventuellement chercher à résoudre
== Idées ==
=== 2023-05-21 - nginx + RFC 9110 - utilisation trop fréquente du code 505 HTTP Version Not Supported ===
En parcourant des logs d’un serveur nginx, je constate des requêtes <code>GET / HTTP/7.9</code> [https://mamot.fr/@Seb35/110406323127847264], alors que, en 2023, la version la fréquente de HTTP est 2.0 et la 3.0 vient d’être publiée (juin 2022) : mettre une version de HTTP égale à 7.9 n’est donc pas une erreur du client mais est une sonde en phase de reconnaissance (soit du fuzzing, soit ciblant un logiciel précis). L’occurence de telles requêtes semble très rare toutefois.
Utiliser un code 5xx laisse à penser que c’est un problème du serveur, hors le serveur ne peut pas implémenter une version de HTTP qui n’existe pas (encore), c’est donc une erreur du client. Ce raisonnement touche au standard [https://datatracker.ietf.org/doc/html/rfc9110#section-15.6.6 RFC 9110 section 15.6.6] plus qu’à nginx.
Pour les '''sysadmins qui observent les logs et particulièrement les erreurs 5xx''' (qui sont des problèmes soit dans les implémentations (à corriger) soit opérationnels (performance notamment)), '''ça oblige à avoir un traitement fin''' : est-ce que la version HTTP existe (client peut-être légitime) ou n’existe pas (attaque obligatoirement) ?
Du côté de '''nginx''', je serais d’avis de '''retourner une erreur 400''' (à défaut d’un meilleur code 4xx), soit avec une liste fixée dans le code disant les versions potentiellement acceptées à l’époque (actuellement ça serait erreur 400 pou HTTP > 3.0 et erreur 505 pour HTTP <= 3.0 s’il n’y a pas de module pour HTTP 3.0 puisqu’il ''pourrait'' y en avoir puisque le standard est disponible). Pour laisser plus de flexibilité, il pourrait être créé un paramètre dans la configuration pour permettre aux sysadmins de changer la version maximum existante sans avoir à changer la version de nginx tout de suite. Ce paramètre pourrait être abusé par les sysadmins qui ne voudraient pas avoir de codes 5xx même si une nouvelle version de HTTP devient disponible et que des clients peuvent alors commencer à la demander.
=== 2023-05-21 - nginx - utilisation plus exhaustive du code 405 Method Not Allowed ===
En parcourant des logs d’un serveur nginx et observant les attaquants opportunistes, je remarque que les méthodes HTTP exotiques ne sont pas rejetées avec le code "405 Method Not Allowed". Par exemple la configuration <code>try_files $uri =404;</code> donne :
* requête = "DELETE /fichier-inexistant.pdf HTTP/1.1" réponse = "404 Not Found" car le fichier n’existe pas
* requête = "DELETE /fichier-existant.pdf HTTP/1.1" réponse = "405 Not Allowed"
Il serait intéressant qu’il y ait un paramètre de configuration <code>methods_allowed GET HEAD POST;</code> par exemple pour '''refuser inconditionnellement des méthodes''' exotiques pour le serveur en question afin de ''limiter encore plus la surface d’attaque''.
La [https://datatracker.ietf.org/doc/html/rfc9110#section-9.1 RFC 9110 section 9.1 Method > Overview] dit que l’implémentation des méthodes GET et HEAD est obligatoire, toutes les autres sont optionnelles et ''peuvent'' changer dynamiquement.
Il y a déjà dans le code de nginx des retours "405 Not Allowed" selon les modules (chercher la constante NGX_HTTP_NOT_ALLOWED, par exemple [https://trac.nginx.org/nginx/browser/nginx/src/http/modules/ngx_http_static_module.c ngx_http_static_module.c] retourne 405 si la méthode n’est pas GET, HEAD ou POST ; ou [https://trac.nginx.org/nginx/browser/nginx/src/http/modules/ngx_http_empty_gif_module.c ngx_http_empty_gif_module.c] retourn 405 si la méthode n’est pas GET ou HEAD), mais il serait préférable que ça retourne toujours 405 si aucun module n’est en capacité de répondre (ou laisser à l’administrateur la possibilité de faire cette liste dans la conf).
PS : je ne suis pas complètement sûr que la fonctionnalité n’existe pas déjà, il est possible que mon observation vienne du fait que Debian compile nginx avec --with-http_dav_module, et peut-être que le verbe DELETE pourrait ''potentiellement'' répondre même si on a explicitement ou implicitement [https://nginx.org/en/docs/http/ngx_http_dav_module.html#dav_methods <code>dav_methods off;</code>] dans le contexte.
==== Actions à faire ====
# <s>Compiler nginx sans aucun module</s>
# Parcourir https://nginx.org/en/docs/dev/development_guide.html
# <s>Re-tester</s>
# <s>Confirmer ou non le problème</s>
# <s>Éventuellement investiguer comment ça se comporte si on active le module dav</s>
# Par rapport au problème que j’observe (en nginx 1.14 de Debian 10 buster et 1.18 de Debian 11 bullseye, y compris après avoir retiré tous les modules dynamiques), '''l’explication la plus vraisemblable est que les nouvelles versions de nginx ont corrigé le problème (entre 1.18 et 1.23)'''
==== Compilation ====
Avec nginx 1.23.0 bddd3f76e3e5 (2023-05-23T00:45:18+04:00)
<code>./auto/configure --with-cc-opt='-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/tmp/nginx/usr/share/nginx --conf-path=/tmp/nginx/etc/nginx/nginx.conf --http-log-path=/tmp/nginx/var/log/nginx/access.log --error-log-path=/tmp/nginx/var/log/nginx/error.log --lock-path=/tmp/nginx/var/lock/nginx.lock --pid-path=/tmp/nginx/run/nginx.pid --modules-path=/tmp/nginx/usr/lib/nginx/modules --http-client-body-temp-path=/tmp/nginx/var/lib/nginx/body --http-fastcgi-temp-path=/tmp/nginx/var/lib/nginx/fastcgi --http-proxy-temp-path=/tmp/nginx/var/lib/nginx/proxy --http-scgi-temp-path=/tmp/nginx/var/lib/nginx/scgi --http-uwsgi-temp-path=/tmp/nginx/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-threads --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-http_addition_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_secure_link_module --with-http_sub_module --with-http_xslt_module</code>
Il n’y a pas le problème : <code>curl -v -X DELETE 'http://127.0.0.1:8080/fichier-existant.txt'</code> et <code>curl -v -X DELETE 'http://127.0.0.1:8080/fichier-inexistant.txt'</code> retournent 405 Not Allowed (et le module dav est innocent).
eacfd1bbd18b20e4693e3491ece153aad2ea0a7b
658145
658144
2023-05-27T11:18:31Z
Seb35
1
/* PdfParser */
wikitext
text/x-wiki
J’expose sur cette page mes contributions en cours ou à venir à des logiciels libres (ou autres domaines de la culture libre).
== Logiciels ==
=== PdfParser ===
[https://github.com/smalot/pdfparser/pull/600 Pull Request #600 - Fix ASCII85 decoding in a specific case] - proposé le 2023-05-02 - tests unitaires ajouté le 2023-05-27
=== flus.io ===
[https://github.com/flusio/flusio/issues/594 Issue #594 - Items en double] ouverte le 2023-05-19 - à suivre, éventuellement chercher à résoudre
== Idées ==
=== 2023-05-21 - nginx + RFC 9110 - utilisation trop fréquente du code 505 HTTP Version Not Supported ===
En parcourant des logs d’un serveur nginx, je constate des requêtes <code>GET / HTTP/7.9</code> [https://mamot.fr/@Seb35/110406323127847264], alors que, en 2023, la version la fréquente de HTTP est 2.0 et la 3.0 vient d’être publiée (juin 2022) : mettre une version de HTTP égale à 7.9 n’est donc pas une erreur du client mais est une sonde en phase de reconnaissance (soit du fuzzing, soit ciblant un logiciel précis). L’occurence de telles requêtes semble très rare toutefois.
Utiliser un code 5xx laisse à penser que c’est un problème du serveur, hors le serveur ne peut pas implémenter une version de HTTP qui n’existe pas (encore), c’est donc une erreur du client. Ce raisonnement touche au standard [https://datatracker.ietf.org/doc/html/rfc9110#section-15.6.6 RFC 9110 section 15.6.6] plus qu’à nginx.
Pour les '''sysadmins qui observent les logs et particulièrement les erreurs 5xx''' (qui sont des problèmes soit dans les implémentations (à corriger) soit opérationnels (performance notamment)), '''ça oblige à avoir un traitement fin''' : est-ce que la version HTTP existe (client peut-être légitime) ou n’existe pas (attaque obligatoirement) ?
Du côté de '''nginx''', je serais d’avis de '''retourner une erreur 400''' (à défaut d’un meilleur code 4xx), soit avec une liste fixée dans le code disant les versions potentiellement acceptées à l’époque (actuellement ça serait erreur 400 pou HTTP > 3.0 et erreur 505 pour HTTP <= 3.0 s’il n’y a pas de module pour HTTP 3.0 puisqu’il ''pourrait'' y en avoir puisque le standard est disponible). Pour laisser plus de flexibilité, il pourrait être créé un paramètre dans la configuration pour permettre aux sysadmins de changer la version maximum existante sans avoir à changer la version de nginx tout de suite. Ce paramètre pourrait être abusé par les sysadmins qui ne voudraient pas avoir de codes 5xx même si une nouvelle version de HTTP devient disponible et que des clients peuvent alors commencer à la demander.
=== 2023-05-21 - nginx - utilisation plus exhaustive du code 405 Method Not Allowed ===
En parcourant des logs d’un serveur nginx et observant les attaquants opportunistes, je remarque que les méthodes HTTP exotiques ne sont pas rejetées avec le code "405 Method Not Allowed". Par exemple la configuration <code>try_files $uri =404;</code> donne :
* requête = "DELETE /fichier-inexistant.pdf HTTP/1.1" réponse = "404 Not Found" car le fichier n’existe pas
* requête = "DELETE /fichier-existant.pdf HTTP/1.1" réponse = "405 Not Allowed"
Il serait intéressant qu’il y ait un paramètre de configuration <code>methods_allowed GET HEAD POST;</code> par exemple pour '''refuser inconditionnellement des méthodes''' exotiques pour le serveur en question afin de ''limiter encore plus la surface d’attaque''.
La [https://datatracker.ietf.org/doc/html/rfc9110#section-9.1 RFC 9110 section 9.1 Method > Overview] dit que l’implémentation des méthodes GET et HEAD est obligatoire, toutes les autres sont optionnelles et ''peuvent'' changer dynamiquement.
Il y a déjà dans le code de nginx des retours "405 Not Allowed" selon les modules (chercher la constante NGX_HTTP_NOT_ALLOWED, par exemple [https://trac.nginx.org/nginx/browser/nginx/src/http/modules/ngx_http_static_module.c ngx_http_static_module.c] retourne 405 si la méthode n’est pas GET, HEAD ou POST ; ou [https://trac.nginx.org/nginx/browser/nginx/src/http/modules/ngx_http_empty_gif_module.c ngx_http_empty_gif_module.c] retourn 405 si la méthode n’est pas GET ou HEAD), mais il serait préférable que ça retourne toujours 405 si aucun module n’est en capacité de répondre (ou laisser à l’administrateur la possibilité de faire cette liste dans la conf).
PS : je ne suis pas complètement sûr que la fonctionnalité n’existe pas déjà, il est possible que mon observation vienne du fait que Debian compile nginx avec --with-http_dav_module, et peut-être que le verbe DELETE pourrait ''potentiellement'' répondre même si on a explicitement ou implicitement [https://nginx.org/en/docs/http/ngx_http_dav_module.html#dav_methods <code>dav_methods off;</code>] dans le contexte.
==== Actions à faire ====
# <s>Compiler nginx sans aucun module</s>
# Parcourir https://nginx.org/en/docs/dev/development_guide.html
# <s>Re-tester</s>
# <s>Confirmer ou non le problème</s>
# <s>Éventuellement investiguer comment ça se comporte si on active le module dav</s>
# Par rapport au problème que j’observe (en nginx 1.14 de Debian 10 buster et 1.18 de Debian 11 bullseye, y compris après avoir retiré tous les modules dynamiques), '''l’explication la plus vraisemblable est que les nouvelles versions de nginx ont corrigé le problème (entre 1.18 et 1.23)'''
==== Compilation ====
Avec nginx 1.23.0 bddd3f76e3e5 (2023-05-23T00:45:18+04:00)
<code>./auto/configure --with-cc-opt='-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/tmp/nginx/usr/share/nginx --conf-path=/tmp/nginx/etc/nginx/nginx.conf --http-log-path=/tmp/nginx/var/log/nginx/access.log --error-log-path=/tmp/nginx/var/log/nginx/error.log --lock-path=/tmp/nginx/var/lock/nginx.lock --pid-path=/tmp/nginx/run/nginx.pid --modules-path=/tmp/nginx/usr/lib/nginx/modules --http-client-body-temp-path=/tmp/nginx/var/lib/nginx/body --http-fastcgi-temp-path=/tmp/nginx/var/lib/nginx/fastcgi --http-proxy-temp-path=/tmp/nginx/var/lib/nginx/proxy --http-scgi-temp-path=/tmp/nginx/var/lib/nginx/scgi --http-uwsgi-temp-path=/tmp/nginx/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-threads --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-http_addition_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_secure_link_module --with-http_sub_module --with-http_xslt_module</code>
Il n’y a pas le problème : <code>curl -v -X DELETE 'http://127.0.0.1:8080/fichier-existant.txt'</code> et <code>curl -v -X DELETE 'http://127.0.0.1:8080/fichier-inexistant.txt'</code> retournent 405 Not Allowed (et le module dav est innocent).
0250151e230da255984cde5f2bfd9cfd5d194df7
Btrfs
0
189
658158
658157
2023-06-15T15:48:26Z
Seb35
1
/* Scripted procedure */
wikitext
text/x-wiki
I tried to have a root filesystem into btrfs for a [https://www.gandi.net Gandi] server, and succeed after a number of trial-error. Here are my steps if it can be useful to others. For an introduction, see [https://en.wikipedia.org/wiki/Btrfs Wikipedia article] and/or [https://btrfs.wiki.kernel.org the dedicated wiki].
WARNING: this could cause DATA LOSS, be sure you have backups (possibly Gandi snapshots).
This was updated on 2020-09-24 for Debian 10 buster + GandiV5, and on 2022-02-02 for Debian 11 bullseye + GandiV5. An [{{fullurl:Btrfs|oldid=658077}} older version] was for Debian 9 jessie or Ubuntu 18.04 LTS + GandiV4.
== Manual procedure ==
=== Create the server ===
On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 MiB RAM, 1 system disk of 5 GiB, Debian 10 buster or Debian 11 bullseye.
For Debian 10 buster (only), define backports (btrfs-progs must contain btrfs-convert, see [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=870286 this Debian bug]) (this is not needed for Debian 11):
echo 'deb https://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/debian-backports.list
Install btrfs-progs:
apt update && apt install -t buster-backports btrfs-progs # Debian 10 buster
apt update && apt install btrfs-progs # Debian 11 bullseye
On GandiV5 :
# stop the server,
# open the page about the system disk in Volumes,
# clone the system disk with another (definitive) name (e.g. the current disk is "sys-myserver", you can define the copied disk as "myserver"),
# start the server,
# wait until the server is started,
# attach this cloned disk to the server.
ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server).
=== Convert to btrfs ===
:''Mostly from [https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3]''
Display the active root filesystem, and you will be able to deduce what is the cloned filesystem:
ls /dev/xvd*
mount|grep xvd
blkid
Copy the result of <code>blkid</code> in some text file on your computer (will be used later).
Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs: ([https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-convert man 8 btrfs-convert])
fsck.ext4 -f /dev/xvdb1 # optional
btrfs-convert -p /dev/xvdb1
Here, I obtained the following error:
root@test:~# btrfs-convert -p /dev/xvdb1
create btrfs filesystem:
blocksize: 4096
nodesize: 16384
features: extref, skinny-metadata (default)
creating ext2 image file
creating btrfs metadata
Unable to find block group for 0 27081]
Unable to find block group for 0
Unable to find block group for 0
ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1
btrfs-convert(+0x11b5a)[0x559c159c1b5a]
btrfs-convert(+0x1589b)[0x559c159c589b]
btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401]
btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c]
btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4]
btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92]
btrfs-convert(+0x10349)[0x559c159c0349]
btrfs-convert(+0x1135f)[0x559c159c135f]
btrfs-convert(main+0x1f59)[0x559c159bdefb]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97]
btrfs-convert(_start+0x2a)[0x559c159bb5ca]
Aborted
According to [https://github.com/kdave/btrfs-progs/issues/123] and [https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg82326.html], it can be worked around: (this command could take some hours, depending on disk size and number of files)
btrfs-convert -d -p /dev/xvdb1
or even:
btrfs-convert -n -d -p /dev/xvdb1
Or, if still unsuccessful, try to add free space, or if still unsuccessfull, [https://github.com/kdave/btrfs-progs/issues/123#issuecomment-455877070 re-compile btrfs-progs in version 4.17.1] (this last try worked for me for 50 Gio disk with 24 Gio free space on Debian 9 jessie, expanded after its original size was 30 Gio (=4 Gio free space)).
Then, mount the filesystem and delete the old ext4 snapshot:
mount /dev/xvdb1 /mnt
btrfs subvolume delete /mnt/ext2_saved
btrfs filesystem defrag -r /mnt # could take dozen of minuts
btrfs balance start /mnt # could take hours
=== Promote as root filesystem ===
:''Mostly from [https://help.ubuntu.com/community/btrfs#Install_as_Root_on_earlier_Ubuntu_versions]''
Edit the /etc/fstab of the btrfs system:
uuid=`blkid|grep -P '^/dev/xvdb1: '|grep -o -P ' UUID="[0-9a-f-]+" '|cut -d'"' -f2`
sed -i -E 's/^UUID=[0-9a-f-]+ *\/ .*$/UUID=$uid \/ btrfs defaults 0 1/' /mnt/etc/fstab
Update Grub in a chrooted system:
for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done
chroot /mnt update-grub
for i in dev/pts dev proc sys; do umount /mnt/$i; done
umount /mnt
Quit:
exit
=== Define the cooked disk as boot disk ===
In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start".
Launch the server (it should correctly start, even if the /boot directory is on the main partition / (some old documents said it didn’t work because grub didn’t know the btrfs filesystem, but it is fixed now)).
df -hT
It should show something like:
/dev/xvda1 btrfs 50G 32G 19G 63% /
Delete the old root disk.
You can delete the packages grub-efi-amd64, grub-efi-amd64-bin, grub-pc, grub-pc-bin since they are not used, but keep /etc/default/grub with Gandi customisations:
cp -a /etc/default/grub /root/grub
apt-get purge -y grub-efi-amd64 grub-efi-amd64-bin grub-pc grub-pc-bin
mv /root/grub /etc/default/grub
apt-mark manual grub-common grub2-common
update-grub # to check it still work and you should reboot now to be sure it reboots correctly
== Scripted procedure ==
This script automates the conversion, with a slightly-modified procedure.
On [https://admin.gandi.net GandiV5], create a new server with e.g. 1 proc, 256 MiB RAM, 1 system disk of 5 GiB, Debian 11 bullseye.
On GandiV5 :
# stop the server,
# open the page about the system disk in Volumes,
# clone the system disk with another (definitive) name (e.g. the current disk is "sys-myserver", you can define the copied disk as "myserver"),
# start the server,
# wait until the server is started,
# attach this cloned disk to the server.
ATTENTION: really start the server before attaching the cloned disk, else the root filesystem might be the cloned disk given they have the same UUID and /etc/fstab is using the UUID to select the root filesystem (it could be workarounded by setting /dev/xvda1 in /etc/fstab before stopin the server).
# Launch this script as root: (<code>vi convert_gandiroot_to_btrfs.sh</code> + <code>chmod +x convert_gandiroot_to_btrfs.sh</code> + (<code>./convert_gandiroot_to_btrfs.sh</code>)
#: The script takes about 3 minutes to convert a 1.4 GiB disk.
<syntaxhighlight lang="shell">
#!/bin/sh
set -e
fs_type=`mount|grep -F ' on / '|grep -o -E ' type [a-z0-9]+ '|cut -d' ' -f3`
blkid=`blkid|grep -F ' LABEL="gandiroot" '`
nb_fs_gandiroot=`echo "$blkid"|cut -d: -f2-|uniq -c|tr -s ' '|cut -d' ' -f2`
if [ "$fs_type" != 'ext4' -o ! "$nb_fs_gandiroot" = 2 ]; then
echo 'It is not possible to convert the disk. There should be two identical devices labeled "gandiroot" formatted in ext4'
exit 2
fi
fs_gandiroot_ext4=`echo "$blkid"|head -n1|cut -d: -f1`
fs_gandiroot_btrfs=`echo "$blkid"|tail -n1|cut -d: -f1`
echo
echo "Current root filesystem: $fs_gandiroot_ext4 (ext4)"
echo "Future root filesystem: $fs_gandiroot_btrfs (currently ext4, will be btrfs)"
set -v
apt-get update
apt-get install -y btrfs-progs
fsck.ext4 -f "$fs_gandiroot_btrfs"
btrfs-convert -p "$fs_gandiroot_btrfs"
mount "$fs_gandiroot_btrfs" /mnt
btrfs subvolume delete -C /mnt/ext2_saved
btrfs filesystem defragment -r /mnt
btrfs balance start /mnt
new_uuid=`blkid|grep -P "^$fs_gandiroot_btrfs: "|grep -o -P ' UUID="[0-9a-f-]+" '|cut -d'"' -f2`
sed -i -E "s/^UUID=[0-9a-f-]+ *\/ .*$/UUID=$new_uuid \/ btrfs defaults 0 1/" /mnt/etc/fstab
for i in dev dev/pts proc sys; do mount --bind /$i /mnt/$i; done
chroot /mnt update-grub
for i in dev/pts dev proc sys; do umount /mnt/$i; done
umount /mnt
</syntaxhighlight>
In Gandi V5 interface, stop the server, detach the old root disk and define the cooked disk as "Use to start".
Launch the server and execute:
df -hT
It should show something like:
/dev/xvda1 btrfs 5G 1.4G 3.5G 28% /
Delete the old root disk.
== Troubleshootings ==
* During a conversion, the root filesystem was mounted read-only in btrfs; it was probably because I didn’t change the options "rw,noatime,errors=remount-ro" to "defaults"
== External links ==
* [https://wiki.xen.org/wiki/PvGrub2 PvGrub2 on Xen wiki]
563f3a9c36cc08a0bcb9def31c5aaa48b36f7ae5